在Groovy中加载、修改和写入XML文档

22
我有一个XML文档,我想从文件中加载它,修改一些特定的元素,然后写回到磁盘。在Groovy中,我找不到任何关于如何执行此操作的示例。
4个回答

42

你可以通过修改节点的value属性来修改元素的值。

/* input:
<root>
  <foo>
    <bar id="test">
      test
    </bar>
    <baz id="test">
      test
    </baz>
  </foo>
</root>
*/

def xmlFile = "/tmp/test.xml"
def xml = new XmlParser().parse(xmlFile)
xml.foo[0].each { 
    it.@id = "test2"
    it.value = "test2"
}
new XmlNodePrinter(new PrintWriter(new FileWriter(xmlFile))).print(xml)

/* output:
<root>
  <foo>
    <bar id="test2">
      test2
    </bar>
    <baz id="test2">
      test2
    </baz>
  </foo>
</root>
*/

3
这个方法可以用,但会破坏文件格式并删除所有注释。这里有一个替代方案可以保留格式和注释:https://dev59.com/zGIj5IYBdhLWcg3wCxB0 - Matthias Braun
3
您可以通过将 new XmlNodePrinter(new PrintWriter(new FileWriter(xmlFile))) 存入一个名为 nodePrinter 的变量中,并在调用 print(xml) 之前设置 nodePrinter.preserveWhitespace = true 来保留格式。 - mikedave
2
对我来说,输出文件是空的。 - Eugene Hoza

6

如果你想使用XmlSlurper

//Open file
def xml = new XmlSlurper().parse('/tmp/file.xml')

//Edit File e.g. append an element called foo with attribute bar
xml.appendNode {
   foo(bar: "bar value")
}

//Save File
def writer = new FileWriter('/tmp/file.xml')

//Option 1: Write XML all on one line
def builder = new StreamingMarkupBuilder()
writer << builder.bind {
  mkp.yield xml
}

//Option 2: Pretty print XML
XmlUtil.serialize(xml, writer)

注意:XmlUtil也可以与@John Wagenleitner的示例中使用的XmlParser一起使用。
参考资料:

我在这里遇到了类似的问题,你能帮我吗?这个问题已经耗费了我两天的时间。 - aolphn

2

这里有一系列详尽的Groovy读写XML的示例,可以参考这里。关于将数据加载/保存到/自文件,Groovy添加到java.io.File的各种方法/属性应该提供所需的功能。示例包括:

File.write(text)
File.text
File.withWriter(Closure closure) 

点击此处查看这些方法/属性的完整列表。


@Gangnus 感谢您的建设性批评。 - Dónal
2
但是你并没有说他需要什么功能。 - Gangnus

0

对于那些发现输出为空的人,这里是解决方案:

def xml = file("${projectDir}/src/main/AndroidManifest.xml")
def manifest = new XmlSlurper().parse(file(xml))
manifest.@package = "com.newapp.id"
xml.withWriter {out->
    XmlUtil.serialize(manifest, out)
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接