1

XMLSlurper を使用して XML ドキュメントを更新するのに問題があります。ほとんどのことは機能しますが、状況によっては、追加したノード (appendNode) が「検索」で見つからないことがあります。新しいノードは処理の最後にありますが、子を追加している最中には見つかりません。

XMLSlurper に関する投稿を見つけました。新しいノードを見つけるには、parseText を再度呼び出すか、または StreaMarkupBuilder (以下を参照) を呼び出す必要があると書かれています。本当?!それは私がSOで検証すると思ったので、とてもぎこちないようです。

コードスニペットを次に示します。ノードが追加されたばかりであっても、「検索」は NoChildren を取得します。

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

「appendNode は丸呑みされたドキュメントを直接変更しません。StreamingMarkupBuilder を使用してドキュメントが書き出されると、編集は「その場で」適用されます。」 http://markmail.org/message/5nmxbhwna7hr5zcq#query:related%3A5nmxbhwna7hr5zcq+page:1+mid:bkdesettsnfnieno+state:results

新しいノードが見つからないのはなぜですか?!

4

1 に答える 1

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
  } )

}

于 2011-08-12T19:25:33.067 に答える