如果元素尚不存在,是否可以将元素附加到 xml
Is there a way to append elements to xml if they are not already existing
有一个现有的 xml 我想添加一个新节点,如果它不存在于 xml。
我是 XML 道路上的新手,我从谷歌搜索开始,因为我相信这将是非常标准的问题。
我正在考虑为此使用 xmltask。
我也找到了一个小例子here
我想在 Ant 中创建一个 macrodef 以允许我的消费者注册他们的端点。
我的 XML 的最终结构如下所示:
<?xml version="1.0" encoding="UTF-8"?>
<configuration>
<endpoints>
<endpoint url="serviceA" />
</endpoints>
</configuration>
我的宏定义是这样的:
<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><endpoint url="@{endpointUrl}" />${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="<endpoint url='@{endpointUrl}' />${line.separator}" position="under" />
</xmltask>
</then>
<else>
<echo message="@{endpointUrl} already found in @{filePath}" />
</else>
</if>
<var name="endpointsCount" unset="true" />
</sequential>
</macrodef>
属性 existsEndpoint
只有一个值是由于 Ant 属性的不可变性。您可以通过添加
在宏中创建 localised 属性
<local name="existsEndpoint"/>
在 <sequential>
块的开头。然后每个宏调用都可以有自己的 属性 值。
有一个现有的 xml 我想添加一个新节点,如果它不存在于 xml。
我是 XML 道路上的新手,我从谷歌搜索开始,因为我相信这将是非常标准的问题。
我正在考虑为此使用 xmltask。
我也找到了一个小例子here
我想在 Ant 中创建一个 macrodef 以允许我的消费者注册他们的端点。
我的 XML 的最终结构如下所示:
<?xml version="1.0" encoding="UTF-8"?>
<configuration>
<endpoints>
<endpoint url="serviceA" />
</endpoints>
</configuration>
我的宏定义是这样的:
<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><endpoint url="@{endpointUrl}" />${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="<endpoint url='@{endpointUrl}' />${line.separator}" position="under" />
</xmltask>
</then>
<else>
<echo message="@{endpointUrl} already found in @{filePath}" />
</else>
</if>
<var name="endpointsCount" unset="true" />
</sequential>
</macrodef>
属性 existsEndpoint
只有一个值是由于 Ant 属性的不可变性。您可以通过添加
<local name="existsEndpoint"/>
在 <sequential>
块的开头。然后每个宏调用都可以有自己的 属性 值。