如果尚不存在将元素追加到xml的方法,

时间:2019-05-23 03:59:52

标签: ant xmltask

具有现有的xml如果要在xml中不存在新节点,我想追加一个新节点。

我是XML领域的一个新手,我从谷歌搜索开始,因为我认为这将是非常标准的问题。

我正在为此使用xmltask

我还找到了一个小例子here

我想在Ant中创建一个macrodef,这将允许我的使用者注册其端点。

我的XML的最终结构如下:

<?xml version="1.0" encoding="UTF-8"?>
<configuration>
  <endpoints>
    <endpoint url="serviceA" />
  </endpoints>
</configuration>

我的macrodef像这样:

  <macrodef name="appendConfigEndpoints">
    <attribute name="filePath" />
    <attribute name="endpointUrl" />
    <sequential>
      <xmltask source="@{filePath}">
        <copy path="count(/configuration/endpoints/endpoint)" property="existsEndpoint" /> <!-- how to check if the endpoint exists -->
      </xmltask>
      <echo message="found ${existsEndpoint} in xml" />
      <if>
        <isfalse value="${existsEndpoint}"/>
        <then>
          <concat destfile="${currentScriptDirectory}/tempFile.xml">
            <string>&lt;endpoint url="@{endpointUrl}" /&gt;${line.separator}</string>
          </concat>
          <xmltask source="@{filePath}" dest="@{filePath}" outputter="simple:2">
            <insert path="/configuration/endpoints" file="${currentScriptDirectory}/tempFile.xml" position="under" />
          </xmltask>
          <delete file="${currentScriptDirectory}/tempFile.xml"/>
        </then>
        <else>
          <echo message="already exists @{endpointUrl} in xml" />
        </else>
      </if>
    </sequential>
  </macrodef>

要生成我的xml,我想这样调用目标

<appendConfigEndpoints filePath="file.xml" endpointUrl="serviceA" />
<appendConfigEndpoints filePath="file.xml" endpointUrl="serviceB" />
<appendConfigEndpoints filePath="file.xml" endpointUrl="serviceC" />
<appendConfigEndpoints filePath="file.xml" endpointUrl="serviceB" />

但是我还没有到那儿,目前我什至无法正确计数

07:29:32.844: found 0 in xml
07:29:32.876: found 0 in xml
07:29:32.882: found 0 in xml
07:29:32.889: found 0 in xml

但是我的输出还可以,只是真的错过了计数器工作

<?xml version="1.0" encoding="UTF-8" standalone="no"?>

<configuration>
  <endpoints>
    <endpoint url="serviceA"></endpoint>
    <endpoint url="serviceB"></endpoint>
    <endpoint url="serviceC"></endpoint>
    <endpoint url="serviceB"></endpoint>
  </endpoints>
</configuration>

更新: 我终于使它工作了,主要是我不了解序列,忘记了属性是不可变的。。。谢谢您对响应的帮助,它帮助我实现了目标。 最终看起来像这样:

  <macrodef name="appendConfigEndpoints">
    <attribute name="filePath" />
    <attribute name="endpointUrl" />
    <sequential>
      <if>
        <not>
          <available file="@{filePath}"/>
        </not>
        <then>
          <echo message="@{filePath} not available, copy template and enrich." />
          <copy file="${currentScriptDirectory}/default/appl/sample.endpoints.xml" tofile="@{filePath}"/>
        </then>
      </if>
      <xmltask source="@{filePath}">
        <copy path="count(//endpoint[@url='@{endpointUrl}'])" property="endpointsCount" />
      </xmltask>
      <if>
        <equals arg1="${endpointsCount}" arg2="0" />
        <then>
          <xmltask source="@{filePath}" dest="@{filePath}" outputter="simple:2" clearBuffers="true">
            <insert path="/configuration/endpoints" xml="&lt;endpoint url='@{endpointUrl}' /&gt;${line.separator}" position="under" />
          </xmltask>
        </then>
        <else>
          <echo message="@{endpointUrl} already found in @{filePath}" />
        </else>
      </if>
      <var name="endpointsCount" unset="true" />
    </sequential>
  </macrodef>

1 个答案:

答案 0 :(得分:1)

属性existsEndpoint仅具有一个值是由于Ant属性的不变性。您可以通过添加

在宏中创建localised属性
<local name="existsEndpoint"/>

<sequential>块的开头。然后,每个宏调用都可以具有自己的属性值。