0

我认为我想做的很简单:使用 XmlSlurper 将子节点动态添加到节点(甚至不知道要添加的节点的名称 - 开发一些框架)。

为了便于解释,像这样:

def colorsNode = new XmlSlurper().parseText("""
    <colors>
        <color>red</color>
        <color>green</color>
    </colors>""") 

NodeChild blueNode = new XmlSlurper().parseText("<color>blue</color>")  // just for  illustration. The actual contents are all dynamic

colorsNode.appendNode(blueNode) // In real life, I need to be be able to take in any node and append to a given node as child.

我期望生成的节点与以下内容相同:

“””
<colors>
    <color>red</color>
    <color>green</color> 
    <color>blue</color>
</colors>"""

但是附加的结果是:

colorsNode
    .node
        .children => LinkedList[Node('red') ->   Node('green')   ->   <b>NodeChild</b>(.node='blue')]

换句话说,附加到 LinkedList 的是包装新节点的 NodeChild,而不是节点本身。

毫不奇怪,查看 NodeChild.java 的源代码:

protected void appendNode(final Object newValue) { 
    this.node.appendNode(newValue, this);
}

好吧,我很乐意将我的代码修改为:

colorsNode.appendNode(blueNode<b>.node</b>)

不幸的是 NodeChild.node 是私有的 :(,不知道为什么!什么是实现我正在尝试的体面的方法?我在网上看不到任何解决方案。

我能够通过调整 Groovy 源代码并公开 NodeChild.node 来完成我的原型设计工作,但现在需要找到一个合适的解决方案。

任何帮助,将不胜感激。

谢谢,阿比马修

4

1 回答 1

0

如果你使用它会更容易XmlParser

@Grab('xmlunit:xmlunit:1.1')
import org.custommonkey.xmlunit.Diff
import org.custommonkey.xmlunit.XMLUnit

def xml = """
    <colors>
        <color>red</color>
        <color>green</color>
    </colors>
"""

def expectedResult = """
    <colors>
        <color>red</color>
        <color>green</color>
        <color>blue</color>
    </colors>
"""

def root = new XmlParser().parseText(xml)
root.appendNode("color", "blue")

def writer = new StringWriter()
new XmlNodePrinter(new PrintWriter(writer)).print(root)
def result = writer.toString()

XMLUnit.setIgnoreWhitespace(true)
def xmlDiff = new Diff(result, expectedResult)
assert xmlDiff.identical()
于 2014-01-03T02:09:11.000 回答