Groovy: ajout d'un Nœud XML un document XML existant
Je suis en utilisant Groovy et je vais essayer d'insérer un nœud xml dans un document xml analysé avec XmlSlurper.
J'ai réussi à ajouter le nœud à la fin du document, mais pas là où j'en ai vraiment besoin.
Original doc:
<xml-fragment xmlns:ser="http://www.bea.com/wli/sb/services" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:con="http://www.bea.com/wli/sb/pipeline/config">
<ser:coreEntry isProxy="true" isEnabled="true" isTracingEnabled="false">
<ser:binding type="SOAP" isSoap12="false" xsi:type="con:SoapBindingType" xmlns:con="http://www.bea.com/wli/sb/services/bindings/config">
<con:wsdl ref="bus/src/main/osb/interfaces/apilink/ChargeServices"/>
<con:port>
<con:name>ChargeServicesPort</con:name>
<con:namespace>java:dk.tdc.apilink.logic.sessions.interfaces</con:namespace>
</con:port>
<con:selector type="SOAP body"/>
</ser:binding>
</ser:coreEntry>
</xml-fragment>
Fragment d'ajouter
def fragmentToAddXml = '''
<ser:security xmlns:ser="http://www.bea.com/wli/sb/services" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:con="http://www.bea.com/wli/sb/pipeline/config">hello</ser:security>
'''
C'est le code que j'utilise.
def root = new XmlSlurper().parseText(file.getText())
root.'core-entry'.appendNode( fragmentToAddXml )
def xmlBuilder = new groovy.xml.StreamingMarkupBuilder().bind{ mkp.yield root }
Veuillez noter que le nouveau nœud doit être placé avant le "ser:" liaison de nœud.
Le résultat devrait être:
<xml-fragment xmlns:ser="http://www.bea.com/wli/sb/services" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:con="http://www.bea.com/wli/sb/pipeline/config">
<ser:coreEntry isProxy="true" isEnabled="true" isTracingEnabled="false">
<ser:security xmlns:ser="http://www.bea.com/wli/sb/services" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:con="http://www.bea.com/wli/sb/pipeline/config">hello</ser:security>
<ser:binding type="SOAP" isSoap12="false" xsi:type="con:SoapBindingType" xmlns:con="http://www.bea.com/wli/sb/services/bindings/config">
<con:wsdl ref="bus/src/main/osb/interfaces/apilink/ChargeServices"/>
<con:port>
<con:name>ChargeServicesPort</con:name>
<con:namespace>java:dk.tdc.apilink.logic.sessions.interfaces</con:namespace>
</con:port>
<con:selector type="SOAP body"/>
</ser:binding>
</ser:coreEntry>
</xml-fragment>
Grâce
Luciano
OriginalL'auteur Luciano Fiandesio | 2011-10-27
Vous devez vous connecter pour publier un commentaire.
Donné le xml (dans une chaîne de contrôle)
Et le xml que vous souhaitez ajouter en tant que:
Ensuite, vous pouvez les analyser à la fois (avec
XmlSlurper
configuré pour utiliser des espaces de noms via le 2èmetrue
paramètre)Ajouter le xml pour ajouter à la
data
nœud (comme vous le voulez à l'intérieur dedata
, paslastname
)Ensuite l'imprimer:
Qui imprime:
Je crois que c'est correct (pas formaté 100% comme je le voudrais, mais correct) 😉
Modifier
Si l'ordre est important, vous pouvez utiliser
XmlParser
comme suit:N'est qu'un exemple de code du travail, si vous il suffit de le coller dans la console groovy? Si oui, pouvez-vous mettre à jour votre question, de sorte qu'il montre de manière plus précise morceau de code XML qui ne fonctionne pas, et je peux avoir un aller à la faire fonctionner 🙂
Oui, votre exemple de code fonctionne parfaitement, je vais mettre à jour la question.
Juste un simple exemple d'échec de xml?: -)
Mise à jour de la réponse à la correspondance de question... croisons les Doigts
OriginalL'auteur tim_yates