【问题标题】:Move a node with Gpath使用 Gpath 移动节点
【发布时间】:2019-01-16 08:09:29
【问题描述】:

给定数据模型

<outerTag>
    <tagA>
        </tagB>
    </tagA>
    <tagC>
        <interestingContent>
           ...
        </interestingContent>
    </tagC> 
</outerTag>    

我想将&lt;interestingContent&gt; 的子节点移动到&lt;tagB&gt;。我不知道要移动的节点的可能内容,它们也可能有子节点。我目前正在使用 GPath,并认为像这样简单的东西应该可以工作:

outertag.tagC.childNodes().each { node ->
    outerTag.tagA.tagB.appendNode(node)
}

但是,虽然我能够从节点读取名称和文本,但 appendNode 似乎并不能解决问题。虽然理论上我可以从孩子那里读取属性、文本和名称,使用它来创建一个新节点并附加该节点,但我觉得这没有必要复杂化,特别是因为它需要是一个递归函数,因为节点可以有子节点自己。

【问题讨论】:

    标签: xml groovy gpath


    【解决方案1】:

    您的代码稍作改动

    def outerTag = new XmlParser().parseText('''<outerTag>
        <tagA>
            <tagB/>
        </tagA>
        <tagC>
            <interestingContent a="a">1</interestingContent>
            <interestingContent a="b">2</interestingContent>
        </tagC>
    </outerTag>''')
    
    outerTag.tagC[0].children().each { child ->
        outerTag.tagA.tagB[0].append(child)
    }
    //reset value for tagC
    outerTag.tagC[0].setValue("")
    
    println groovy.xml.XmlUtil.serialize(outerTag)
    

    【讨论】:

    • 我没有这个作为字符串,但到目前为止只有 GPath。我仍然可以通过无论如何转换来使用这个解决方案,或者它甚至需要转换吗?那里的 [0] 有什么用途?
    • 字符串使代码可运行。您如何构建或解析 xml 并不重要。 [0] 指定要访问的标签(tagA 中可以有多个 tagB)。 outerTag.tagC 返回节点列表,但 outerTag.tagC[0] 只返回一个第一个节点..
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-26
    • 1970-01-01
    相关资源
    最近更新 更多