我正在尝试将节点插入现有的XML文档中。 我使用groovy和ANT。
我的XML看起来像:
<root>
<node1 db="a"
user="test"/>
</root>
在这个XML文件中,我有一个看起来那样的groovy部分:
我的groovy脚本,嵌入在ANT xml文件中。
<target name="some-target">
<script language="groovy">
def fragment = '''<root>
<node1 db="a"
user="test"/>
</root>''';
def parser = new XmlParser();
xml.appendNode{fragment};
def xmlOutput = new StringWriter();
def xmlNodePrinter = new XmlNodePrinter(new PrintWriter(xmlOutput));
xmlNodePrinter.print(xml);
现在,我只想添加第二个节点,但我不知道如何实现这个目标?
如果我现在添加第二个节点,我总是在结果中得到以下输出:
<root>
<node1 db="a"
user="test"/>
<Script1$_run_closure2@451001e5/>
</root>
提前感谢您的帮助!
答案 0 :(得分:1)
无需使用Ant任务,您可以在普通的Groovy中执行此操作:
假设您有一个指向现有XML的文件变量
def fileText = new File('/tmp/test.xml')
然后,你可以这样做:
import groovy.xml.*
def fileText = new File('/tmp/test.xml')
def parser = new XmlParser()
def xml = parser.parse('/tmp/test.xml')
// Add a new node
xml.append(parser.parseText('<node2 db="c" user="test2"/>'))
// Write it out over the top of the original file
def xmlOutput = new StringWriter()
def xmlNodePrinter = new XmlNodePrinter(new PrintWriter(xmlOutput))
xmlNodePrinter.print(xml)
fileText.text = xmlOutput.toString()
是的,这是附加节点的两种方法。我将xmltask.jar
放在与构建相同的文件夹中。第一个目标使用xmltask,第二个目标使用groovy。
我还将test.xml
添加到同一目录中,这是读入,附加和写出的内容
<project name="Xml Foozling" basedir=".">
<path id="runtime.path">
<pathelement location="xmltask.jar"/>
</path>
<taskdef name="xmltask" classname="com.oopsconsultancy.xmltask.ant.XmlTask" classpathref="runtime.path"/>
<target name="insert-node-with-xml-task">
<xmltask source="test.xml" dest="output-task.xml">
<insert path="/root">
<![CDATA[
<node1 db="new" user="hooray"/>
]]>
</insert>
</xmltask>
</target>
<target name="insert-node-with-groovy">
<script language="groovy">
<![CDATA[
import groovy.xml.*
new XmlParser().with { parser ->
parser.parse('test.xml').with { xml ->
xml.append(parser.parseText('<node2 db="new" user="hooray"/>'))
new File('output-script.xml').withWriter { out ->
new XmlNodePrinter(new PrintWriter(out)).print(xml)
}
}
}
]]>
</script>
</target>
</project>
手指交叉