Vraiment suppression de nœuds dans XMLParser Objet Groovy
Comment supprimer un nœud via parseur xml:
x='''<X>
<A>
<B c3='1'>
<C1>a</C1>
<C2>b</C2>
</B>
<B c3='2'>
<C1>e</C1>
<C2>e</C2>
</B>
<B c3='3'>
<C1>f</C1>
<C2>f</C2>
</B>
</A>
</X>
'''
xml=new XmlParser().parseText(x)
def nodeToDel=xml.A.B.find{it.@C1='a'}
xml.remove(nodeToDel)
println xml
new XmlNodePrinter(new PrintWriter(new FileWriter(new File('c:/temp/a.xml')))).print(xml)
Semble fonctionner MAIS!!!!
comme je l'ai traduit cela à mon problème il encore enregistre le xml d'origine althoguh de retourner true après l'exécution de supprimer la méthode.
J'ai googlé un peu et trouvé ce BUG. Et il me semble que je suis touchés aujourd'hui. Comment puis-je le résoudre? Est-il une solution, ou dois-je revenir aux racines et de commencer à copier linewise...?? Groovy vraiment ungroovy ici :-/
modifier: Comme écrit ci-dessous, et vous avez une expérience à part cela, il n'est pas possible de supprimer la balise où est 'e' de cette façon. Seul le premier Enregistrement sera supprimé. Je pense qu'il y a un problème avec le format xml. N'ayant pas le besoin format:
<A x='1' y='2'></A>
et en avoir dans le format
<A> <x>1</x> <y>2</y> </A>
Est quelqu'un capable de reproduire ce bug?
edit2: je suis en utilisant le GroovyConsole 1.8.0. Ajout de la c3 attributs pour l'exemple. Essayé de le supprimer avec la même méthode, le même bug: La première section a été supprimée...
Maintenant, le plus impressionnant bug: il a Essayé avec un autre code:
def xml=new XmlParser().parseText(x)
xml.A.remove(xml.A.B.find{it.@'c3'= '3'}) //want to remove third section
new XmlNodePrinter(new PrintWriter(new FileWriter(new File('c:/temp/a.xml')))).print(xml)
résultats que la première section de la propriété c3 est modifié pour 3 ?!?!?!?!? wtf...
Je suis en train d'essayer de trouver une solution pour une semaine maintenant, c'est assez épuisant...
Quelqu'un a une idée?
OriginalL'auteur Booyeoo | 2011-08-26
Vous devez vous connecter pour publier un commentaire.
En supprimant des nœuds fonctionne assez bien comme les autres DOM Api. Vous devez passer le nœud que vous souhaitez supprimer pour le supprimer de la méthode de son parent.
Également la
=
opérateur est l'opérateur d'affectation en Groovy.it.@C1 = 'a'
attribuer'a'
à laC1
attribut de chaqueB
nœud dans le document. Depuis le résultat de cette affectation est'a'
, qui est contrainte detrue
par Groovy,find
retournera toujours le premier nœud qu'il rencontre.xml=new XmlParser().parseText(x) def nodeToDel=xml.A.B.find{it.@C1= 'e'} def parent = nodeToDel.parent() parent.remove(nodeToDel) new XmlNodePrinter(new PrintWriter(new FileWriter(new File('c:/temp/a.xml')))).print(xml)
Je vois le problème. Je me suis concentré sur la question de savoir comment supprimer des nœuds, cependant la GPath expression a également été incorrect et que par coïncidence produit le résultat souhaité, car le nœud qu'il était à la recherche de qui est arrivé à être le premier. J'ai mis à jour ma réponse. Laissez-moi savoir si cela fonctionne mieux.
Merci champion, ça marche... j'ai déjà demandé au sujet de l' = et ce aussi expliquer pourquoi il y avait un nouvel attribut fait dans le fichier xml.. et maintenant, j'ai obtenu le résultat requis. La seule chose que j'ai toujours pas l'obtenir, comment il fonctionne avec les attributs maintenant:
<B c3='3'>
je supposeit.@'c3'== '3'
mais cela ne fonctionne pas, et ne fonctionne pas avec.text()
soitSi vous êtes en train de faire
xml.A.B.C1.find
puis la fermetureit
ne doit être C1 éléments.xml.A.B.find { it.@c3 == '3' }
doit trouver le premier élément B avec une c3 attribut avec une valeur de 3.OriginalL'auteur Justin Piper