Pergunta

I am having troubles using XMLSlurper to update an XML document. Most things work, but in some situations a "find" doesn't find a Node I just appended (appendNode). The new Node is there at the end of processing, but is not found when I am in the middle of adding children.

I found a post about XMLSlurper that says that finding the new Node requires calling parseText again and/or StreaMarkupBuilder (see below). Really?! That seems so kludgy that I thought I'd verify on SO.

Here is a code snippet. The "find" gets NoChildren even though the Node was just added.

    codeNode.appendNode {   
    'lab:vendorData'() {}
}
vendorNode = codeNode.children().find { it.name() == "vendorData" } 

"appendNode doea not modify the slurped document directly. The edit is applied "on the fly" when the document is written out using StreamingMarkupBuilder." http://markmail.org/message/5nmxbhwna7hr5zcq#query:related%3A5nmxbhwna7hr5zcq+page:1+mid:bkdesettsnfnieno+state:results

Why can't I find my new Node?!

Foi útil?

Solução

This is what I got to work. Is not elegant, but got past "update" problem:

    ...
codeNode.appendNode {   
    'lab:vendorData'() {}
}
//-- must re-slurp to see appended node
labDoc = new XmlSlurper().parseText(serializeXml(labDoc))
codeNode = getResultNodeFor( nextResult.getCode() );
vendorNode = codeNode.children().find { it.name() == "vendorData" }
...
def String serializeXml(GPathResult xml){
XmlUtil.serialize(new StreamingMarkupBuilder().bind {
        mkp.declareNamespace("lab", "www.myco.com/LabDocument")
        mkp.yield labDoc
  } )

}

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top