【问题标题】:Groovy markup builder replace the rootGroovy 标记生成器替换根
【发布时间】:2013-12-13 20:43:06
【问题描述】:
import groovy.xml.MarkupBuilder

class XmlTest {
    static void main(def args) {
        def XmlTest s = new XmlTest()
        s.xmlTest()
    }

    def xmlTest() {
        def xml = new MarkupBuilder()
        xml.root{
            response(this.xmlClosure())
        }
    }

    def xmlClosure() {
        return {x("y")}
    }
}

预期的输出是<x>y</x> 我无法修改关闭。我需要在不添加任何节点的情况下将闭包转换为 XML 文档。

【问题讨论】:

  • 我收到的输出是 y
  • 请向问题本身添加其他详细信息,而不是作为 cmets。
  • 我猜你可以做'return new MarkupBuilder().x("y")'并一起跳过xmlClosure方法,但这不是你想要的,对吧?你的问题是“我怎样才能剥离 -元素?”,还是我出路?
  • 是的,你是对的 silverbeak。我无法修改关闭。实际的闭包是复杂的嵌套元素和数组。我需要一种去除根元素的方法

标签: xml groovy root markupbuilder


【解决方案1】:

这可能会有所帮助,但如果您的元素类型不仅仅是“x”,您可能应该稍微扩展一下。通过让构建器写入写入器,您可以以更可控的方式控制结果。然后,使用编写器,您可以使用 StreamingMarkupBuilder 提取所需的元素。

这是一种非常迂回的方式,对于非常大的 XML 结构,它可能效率不高。

我还冒昧地省略了“响应”元素,因为我认为它没有任何意义。如果您绝对需要它,请随时将其放回原处。

import groovy.xml.MarkupBuilder
import groovy.util.XmlSlurper
import groovy.xml.StreamingMarkupBuilder

class XmlTest {
    static void main(def args) {
        def sw = new StringWriter()
        println new XmlTest().xmlTest(sw)
    }

    def xmlTest(writer) {
        def builder = new MarkupBuilder(writer)        
        builder.root(xmlClosure())

        def text = new XmlSlurper().parseText(writer.toString())

        def outputBuilder = new StreamingMarkupBuilder()
        def result = outputBuilder.bind{ mkp.yield text.x }
        return result
    }

    def xmlClosure() {
        return {x("y")}
    }
}

祝你好运。

【讨论】:

  • 感谢它的工作。我唯一担心的是,我们再次重新解析 xml 以删除节点。闭包将 mkp 作为参数。我无法将 mkp 指定为 xmlClosure() 的参数
猜你喜欢
  • 1970-01-01
  • 2010-11-20
  • 2012-12-26
  • 2010-12-02
  • 1970-01-01
  • 2019-05-22
  • 1970-01-01
  • 1970-01-01
  • 2014-10-04
相关资源
最近更新 更多