【发布时间】:2010-11-30 22:59:51
【问题描述】:
我有一个如下形式的 XML 文件 -
<map MAP_XML_VERSION="1.0">
<entry key="database.user" value="user1"/>
...
</map>
ant 是否具有读取此内容并让我执行 xquery 以拉回键值的本机能力?通过 API 我没有看到这样的功能。
【问题讨论】:
我有一个如下形式的 XML 文件 -
<map MAP_XML_VERSION="1.0">
<entry key="database.user" value="user1"/>
...
</map>
ant 是否具有读取此内容并让我执行 xquery 以拉回键值的本机能力?通过 API 我没有看到这样的功能。
【问题讨论】:
可选的 Ant 任务 XMLTask 就是为此而设计的。给它一个 XPath 表达式,您可以将上面的内容选择到(比如说)一个属性中。 Here's an article 如何使用它,并附有示例。它还将执行大量其他与 XML 相关的操作/查询/创建。
例如
<xmltask source="map.xml">
<!-- copies to a property 'user' -->
<copy path="/map/entry[@key='database.user']/@value" attrValue="true" property="user"/>
</xmltask>
免责声明:我是作者。
【讨论】:
您可以使用scriptdef 标记为您的类创建一个JavaScript 包装器。在 JS 中,您几乎拥有 Java 的全部功能,并且可以进行任何类型的复杂 XML 解析。
例如:
<project default="build">
<target name="build">
<xpath-query query="//entry[@key='database.user']/@value"
xmlFile="test.xml" addproperty="value"/>
<echo message="Value is ${value}"/>
</target>
<scriptdef name="xpath-query" language="javascript">
<attribute name="query"/>
<attribute name="xmlfile"/>
<attribute name="addproperty"/>
<![CDATA[
importClass(java.io.FileInputStream);
importClass(javax.xml.xpath.XPath);
importClass(javax.xml.xpath.XPathConstants);
importClass(javax.xml.xpath.XPathFactory);
importClass(org.xml.sax.InputSource);
var exp = attributes.get("query");
var filename = attributes.get("xmlfile");
var input = new InputSource(new FileInputStream(filename));
var xpath = XPathFactory.newInstance().newXPath();
var value = xpath.evaluate(exp, input, XPathConstants.STRING);
self.project.setProperty( attributes.get("addproperty"), value );
]]>
</scriptdef>
</project>
【讨论】:
听起来你想要ant-xpath-task 之类的东西。我不知道使用 Ant 执行此操作的内置方法。
【讨论】: