XMLSlurper appendNode не видит изменений - PullRequest
1 голос
/ 12 августа 2011

У меня проблемы с использованием XMLSlurper для обновления XML-документа. Большинство вещей работает, но в некоторых ситуациях «find» не находит узел, который я только что добавил (appendNode). Новый узел находится в конце обработки, но не обнаруживается, когда я добавляю дочерние элементы.

Я нашел сообщение о XMLSlurper, в котором говорится, что для поиска нового узла необходимо снова вызвать parseText и / или StreaMarkupBuilder (см. Ниже). В самом деле?! Это кажется таким глупым, что я решил проверить на SO.

Вот фрагмент кода. "Find" получает NoChildren, хотя Node был только что добавлен.

    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

Почему я не могу найти свой новый узел?!

1 Ответ

0 голосов
/ 12 августа 2011

Это то, что я получил на работу. Это не элегантно, но прошло проблему "обновления":

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

}

...