我在使用XMLSlurper更新XML文档时遇到了麻烦。大多数事情都有效,但在某些情况下,“find”找不到我刚刚追加的节点(appendNode)。新节点在处理结束时就在那里,但是当我正在添加子节点时找不到它。
我找到一篇关于XMLSlurper的帖子,说找到新的Node需要再次调用parseText和/或StreaMarkupBuilder(见下文)。真?!这看起来很蹩脚,我以为我会在SO上验证。
这是一段代码段。即使刚刚添加了Node,“find”也会获得NoChildren。
codeNode.appendNode {
'lab:vendorData'() {}
}
vendorNode = codeNode.children().find { it.name() == "vendorData" }
“appendNode doea不会直接修改slurped文档。当使用StreamingMarkupBuilder写出文档时,编辑将”动态“应用。” http://markmail.org/message/5nmxbhwna7hr5zcq#query:related%3A5nmxbhwna7hr5zcq+page:1+mid:bkdesettsnfnieno+state:results
为什么我找不到新的节点?!
答案 0 :(得分:0)
这就是我的工作。不优雅,但过了“更新”问题:
...
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
} )
}