在 Ant 脚本中查找资源引用 XML 标记
Finding a resource-ref XML Tag In Ant Script
我想使用 ant 脚本以编程方式删除 XML 的一大块。我找到了很棒的 xmltask 任务,但我终究找不到要删除的 resource-ref
节点。
这是我的 XML 文档的一部分。它来自使用标准 DTD 的 web.xml
文件:
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<web-app xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" id="WebApp_ID"
version="3.0" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd">
<display-name>Foo</display-name>
<resource-ref>
<description>Something Clever</description>
<res-ref-name>jdbc/foo1</res-ref-name>
<res-type>javax.sql.DataSource</res-type>
<res-auth>Container</res-auth>
</resource-ref>
<resource-ref>
<description>Reports Database</description>
<res-ref-name>jdbc/foo2</res-ref-name>
<res-type>javax.sql.DataSource</res-type>
<res-auth>Container</res-auth>
</resource-ref>
</web-app>
我正在尝试删除第二个 resource-ref
块,如下所示:
<project name="test" basedir="." default="fixxml">
<taskdef name="xmltask" classname="com.oopsconsultancy.xmltask.ant.XmlTask"/>
<target name="fixxml" description="er doy">
<xmltask source="web.xml" dest="output.xml">
<remove path="/web-app/resource-ref/description[text()='Reports Database']" />
</xmltask>
</target>
</project>
但是,它不起作用。我还尝试了以下 remove
语句:
<remove path="/web-app/resource-ref[2]" />
....
<remove path="//description[text()[normalize-space(.)='Reports Database']]"" />
None 其中有工作。有没有人看到我的查询可能做错了什么?
主要问题可能是您的 web.xml 声明了一个名称 - space,但您的 xpath 忽略了它。
请参阅:
另一个问题可能是您的 xpath 表达式将 'description' 元素指定为要删除的节点,而不是其父节点。
建议的编辑(未经测试):
<remove path="path="/*[local-name()='web-app']/*[local-name()='resource-ref'][2]"/>
Patrice 的回答似乎最能说明问题。 Xpath 似乎忽略了我的名称空间。因此,我尝试使用这些知识和用 Java 编写的各种 xpath 帮助程序 fiddle 和 "query string"。折腾了很久,终于放弃了这条路。
我最终通过执行以下操作解决了这个问题:
- 正在编写删除 XML 块的 shell 脚本。
- 正在从我的 Ant 文件中调用该脚本。
请注意,对我而言,这不是选项 A 或 B - 它更像是选项 M。但我真的负担不起学习 Xpath 的所有缺点以及它如何在流行的 Java 图书馆。
我想使用 ant 脚本以编程方式删除 XML 的一大块。我找到了很棒的 xmltask 任务,但我终究找不到要删除的 resource-ref
节点。
这是我的 XML 文档的一部分。它来自使用标准 DTD 的 web.xml
文件:
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<web-app xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" id="WebApp_ID"
version="3.0" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd">
<display-name>Foo</display-name>
<resource-ref>
<description>Something Clever</description>
<res-ref-name>jdbc/foo1</res-ref-name>
<res-type>javax.sql.DataSource</res-type>
<res-auth>Container</res-auth>
</resource-ref>
<resource-ref>
<description>Reports Database</description>
<res-ref-name>jdbc/foo2</res-ref-name>
<res-type>javax.sql.DataSource</res-type>
<res-auth>Container</res-auth>
</resource-ref>
</web-app>
我正在尝试删除第二个 resource-ref
块,如下所示:
<project name="test" basedir="." default="fixxml">
<taskdef name="xmltask" classname="com.oopsconsultancy.xmltask.ant.XmlTask"/>
<target name="fixxml" description="er doy">
<xmltask source="web.xml" dest="output.xml">
<remove path="/web-app/resource-ref/description[text()='Reports Database']" />
</xmltask>
</target>
</project>
但是,它不起作用。我还尝试了以下 remove
语句:
<remove path="/web-app/resource-ref[2]" />
....
<remove path="//description[text()[normalize-space(.)='Reports Database']]"" />
None 其中有工作。有没有人看到我的查询可能做错了什么?
主要问题可能是您的 web.xml 声明了一个名称 - space,但您的 xpath 忽略了它。
请参阅:
另一个问题可能是您的 xpath 表达式将 'description' 元素指定为要删除的节点,而不是其父节点。
建议的编辑(未经测试):
<remove path="path="/*[local-name()='web-app']/*[local-name()='resource-ref'][2]"/>
Patrice 的回答似乎最能说明问题。 Xpath 似乎忽略了我的名称空间。因此,我尝试使用这些知识和用 Java 编写的各种 xpath 帮助程序 fiddle 和 "query string"。折腾了很久,终于放弃了这条路。
我最终通过执行以下操作解决了这个问题:
- 正在编写删除 XML 块的 shell 脚本。
- 正在从我的 Ant 文件中调用该脚本。
请注意,对我而言,这不是选项 A 或 B - 它更像是选项 M。但我真的负担不起学习 Xpath 的所有缺点以及它如何在流行的 Java 图书馆。