2010-11-04 5 views
4

J'ai lu l'article Groovy Codehaus sur Updating XML with XmlSlurper, ce qui m'amène à la question suivante. Considérons que nous avons une entrée XML structurée comme la prochaine:Comment mettre à jour XML avec XML Slurper de groovy?

<customer> 
    <address> 
    <street /> 
    <city /> 
    <postalcode /> 
    </address> 
</customer> 

Est-il possible de changer le XML sans connaître sa structure concrète? Béton: Nous avons une référence au nœud address et voulons le multiplier 3 fois sans connaître les détails?

address.multiply(3) 

La sortie devrait ressembler à ceci:

<customer> 
    <address> 
    <street /> 
    <city /> 
    <postalcode /> 
    </address> 
    <address> 
    <street /> 
    <city /> 
    <postalcode /> 
    </address> 
    <address> 
    <street /> 
    <city /> 
    <postalcode /> 
    </address> 
</customer> 

Cela pourrait être possible avec appendNode mais je manque une méthode clone pour les noeuds de groovy. Y a-t-il une solution pour y parvenir?

Répondre

9

La seule façon que je peux penser actuellement pour les nœuds de clonage est de sérialisation au texte, et les analyser de nouveau en tant que nouveaux morceaux de xml

comme ceci:

import groovy.xml.StreamingMarkupBuilder 
import groovy.xml.XmlUtil 

def xml = """ 
<customer> 
    <address> 
    <street /> 
    <city /> 
    <postalcode /> 
    </address> 
</customer> 
""" 

def root = new XmlSlurper().parseText(xml) 
2.times { 
    String addressXml = new StreamingMarkupBuilder().bindNode(root.address) 
    clonedAddress = new XmlSlurper().parseText(addressXml) 
    root.appendNode(clonedAddress) 
} 

println XmlUtil.serialize(root) 

qui imprime:

<?xml version="1.0" encoding="UTF-8"?> 
<customer> 
    <address> 
    <street/> 
    <city/> 
    <postalcode/> 
    </address> 
    <address> 
    <street/> 
    <city/> 
    <postalcode/> 
    </address> 
    <address> 
    <street/> 
    <city/> 
    <postalcode/> 
    </address> 
</customer> 

Il y a probablement une façon plus propre de le faire ... mais pour le moment, mon esprit est un blanc ...

+0

Merci, ça m'a beaucoup aidé. Si jamais vous trouvez une façon plus simple de faire ceci: s'il vous plaît faites le moi savoir! – codevour

Questions connexes