2009-09-30 10 views
3

Je fais du traitement XML avec groovy. Plus précisément, j'inhale un fichier XML via XMLParser, en effectuant un lot de traitement en mémoire, puis en sérialisant les données résultantes en XML via un MarkupBuiler.Puis-je donner à markupbuilder de groovy une liste de nœuds?

La grande majorité des données du fichier est transférée vers une hiérarchie d'objets non basée sur xml pour dialoguer avec l'interface graphique et effectuer le traitement, de sorte que les deux fichiers XML ne se connaissent jamais.

Cependant, il y a un slug de XML qui vit à la limite du fichier source qui doit être copié textuellement dans le fichier XML de sortie avec peu ou pas de traitement. Y a-t-il un moyen de donner à MarkupBuilder une nodelist de XMLParser et de l'insérer dans le document?

Quelque chose comme ceci:

def builder = new MarkupBuilder() 
builder.outermosttag(name: 'library') { 
    someothertag(name: 'shelf') { 

    //magically insert a nodelist of arbitrary XML from somewhere else 

    } 
} 

Répondre

0

Je n'ai pas vraiment essayé ... mais si vous sérialiser la nodelist à une chaîne que vous pourriez être en mesure de le faire:

builder.yieldUnescaped(xmlString) 

encore un peu désordonné si ...

3

XmlParser renvoie un nœud et je ne connais aucun moyen de l'insérer dans un balisage ou StreamingMarkupBuilder sans convertir en une chaîne xml.

import groovy.xml.* 

def x = """ 
<root> 
    <somenode1> 
     <anode>foo</anode> 
    </somenode1> 
    <somenode2> 
     <anode>bar</anode> 
    </somenode2> 
</root> 
""".trim() 
def otherXml = new XmlParser().parseText(x) 

def writer = new StringWriter() 
new XmlNodePrinter(new PrintWriter(writer)).print(otherXml.somenode1[0]) 

def builder = new MarkupBuilder() 
builder.outermosttag(name: 'library') { 
    someothertag(name: 'shelf') { 

    mkp.yieldUnescaped writer.toString() //magically insert a nodelist of arbitrary XML from somewhere else 

    } 
} 

Pour ce genre de travail que je tendance à utiliser XmlSlurper avec le StreamingMarkupBuilder:

import groovy.xml.* 

def x = """ 
<root> 
    <somenode1> 
     <anode>foo</anode> 
    </somenode1> 
    <somenode2> 
     <anode>bar</anode> 
    </somenode2> 
</root> 
""".trim() 
def otherXml = new XmlSlurper().parseText(x) 

def builder = new StreamingMarkupBuilder().bind { 
    outermosttag(name: 'library') { 
     someothertag(name: 'shelf') { 

      mkp.yield otherXml.somenode1 //magically insert a nodelist of arbitrary XML from somewhere else 

     } 
    } 
} 
1

Voici comment je pourrais insérer un Nodelist DOM au milieu tout en utilisant un DOMBuilder.

def nodelist = getFromSomewhereElse() 
builder.outermosttag(name: 'library') { 
    someothertag(name: 'shelf') { 
    nodelist.each{ delegate.current.appendChild(it) } 
    } 
}