代码之家  ›  专栏  ›  技术社区  ›  Christopher Klewes

如何用groovy的XML Slurper更新XML?

  •  4
  • Christopher Klewes  · 技术社区  · 14 年前

    我读了Groovy Codehaus关于 Updating XML with XmlSlurper ,这就引出了下面的问题。假设我们有一个输入XML,结构如下:

    <customer>
      <address>
        <street />
        <city />
        <postalcode />
      </address>
    </customer>
    

    是否可以在不知道XML的具体结构的情况下更改它?混凝土:我们有一个参考 address 节点并想在不知道任何细节的情况下将其乘以3?

    address.multiply(3)
    

    输出应该如下所示:

    <customer>
      <address>
        <street />
        <city />
        <postalcode />
      </address>
      <address>
        <street />
        <city />
        <postalcode />
      </address>
      <address>
        <street />
        <city />
        <postalcode />
      </address>
    </customer>
    

    appendNode 但我缺少groovy中节点的克隆方法。有什么办法可以做到这一点吗?

    2 回复  |  直到 14 年前
        1
  •  9
  •   tim_yates    14 年前

    我目前能想到的克隆节点的唯一方法是将它们序列化为文本,并将它们解析为新的xml位

    就像这样:

    import groovy.xml.StreamingMarkupBuilder
    import groovy.xml.XmlUtil
    
    def xml = """
    <customer>
      <address>
        <street />
        <city />
        <postalcode />
      </address>
    </customer>
    """
    
    def root = new XmlSlurper().parseText( xml )
    2.times {
      String addressXml = new StreamingMarkupBuilder().bindNode( root.address )
      clonedAddress = new XmlSlurper().parseText( addressXml )
      root.appendNode( clonedAddress )
    }
    
    println XmlUtil.serialize( root )
    

    打印出来的是:

    <?xml version="1.0" encoding="UTF-8"?>
    <customer>
      <address>
        <street/>
        <city/>
        <postalcode/>
      </address>
      <address>
        <street/>
        <city/>
        <postalcode/>
      </address>
      <address>
        <street/>
        <city/>
        <postalcode/>
      </address>
    </customer>
    

    可能有一种更简洁的方法…但目前,我的头脑是一片空白。。。

        2
  •  1
  •   chown    13 年前