2013-03-05 4 views
2

J'ai un fichier XML, et je veux le lire - supprimer un noeud - enregistrez-le. Je cours perl de terminal (perl script.pl)perl - supprimer le noeud du fichier xml

exemple XML (filename.xml):

<?xml version="1.0" encoding="UTF-8"?> 
<twice> 
    <inner> 
     <twice> 
      <name>John</name> 
      <surname>Smith</surname> 
     </twice> 
     <twice> 
      <name>Alan</name> 
      <surname>Bowler</surname> 
     </twice> 
     <twice> 
      <name>Michael</name> 
      <surname>Deck</surname> 
     </twice> 
    </inner> 
</twice> 

exemple de script perl (de script.pl):

use strict; 
use warnings; 
use XML::LibXML; 
my $filename = "filename.xml"; 
my $parser = XML::LibXML->new(); 
my $xmldoc = $parser->parse_file($filename); 
for my $dead ($xmldoc->findnodes(q{/twice/inner/twice[surname = "Bowler"]})) { 
    $dead->unbindNode; 
} 
print $xmldoc->toString; 

Maintenant sorties le résultat attendu dans le terminal, mais sans enregistrer le fichier.
Résultat attendu (NomFichier.xml):

<?xml version="1.0" encoding="UTF-8"?> 
<twice> 
    <inner> 
     <twice> 
      <name>John</name> 
      <surname>Smith</surname> 
     </twice> 
     <twice> 
      <name>Michael</name> 
      <surname>Deck</surname> 
     </twice> 
    </inner> 
</twice> 

J'ai cherché pendant plusieurs heures et ne pouvait pas trouver quoi que ce soit, désolé si c'est un doublon!
Ceci est ma première expérience avec Perl alors s'il vous plaît toute aide serait la bienvenue, merci.

+0

C'est étrange, il a enlevé le Dossier de bowler pour moi. Ou voulez-vous dire qu'il imprime bien au terminal, mais n'enregistre pas le fichier filename.xml? – Nate

+0

exactement, il ne sauvegarde pas le fichier – dimmageiras

Répondre

5

Lorsque vous utilisez toString les docs disent le faire comme ceci:

open my $out_fh, '>', 'somefile.xml'; 
print {$out_fh} $xmldoc->toString; 

Vous pouvez également utiliser la fonction toFile() pour l'enregistrer:

$xmldoc->toFile("someFile.xml"); 

Edit: également citer les documents, (ce qui est tout ce que j'ai fait), vous pouvez passer le paramètre de format à ces fonctions.

Si le format de $ 0, que le document est vidé comme il était à l'origine parsé

Si le format $ est 1, libxml2 ajoutera des espaces blancs ignorables, de sorte que les noeuds contenu est plus facile à lire. nœuds de texte existants ne seront pas modifiés

Si le format $ 2 (ou plus), libxml2 agira en tant que format $ == 1 mais il ajouter un leader et un saut de ligne de fuite à chaque nœud de texte.

vous donner:

$xmldoc->toFile("someFile.xml", $format); 

ou

print {$out_fh} $xmldoc->toString($format); 
+0

Merci Nate, c'est exactement ce dont j'avais besoin! – dimmageiras

1

Vous pouvez également utiliser App::Xml_grep2 pour le faire à partir de la ligne de commande:

xml_grep2 -v '/twice/inner/twice[surname = "Bowler"]' input.xml > output_xml 
+0

Belle suggestion, mais je n'ai pas mentionné que je le fais à partir d'un iPhone – dimmageiras

Questions connexes