Groovy - 使用echoxml将节点添加到现有XML文件

时间:2018-03-19 13:48:00

标签: xml groovy

我正在尝试将节点插入现有的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 = '''&lt;root&gt;
 &lt;node1 db=&quot;a&quot; 
   user=&quot;test&quot;/&gt;
&lt;/root&gt;''';

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>

提前感谢您的帮助!

1 个答案:

答案 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>

手指交叉