我有以下形式的XML文件 -Ant和XML配置文件解析
<map MAP_XML_VERSION="1.0">
<entry key="database.user" value="user1"/>
...
</map>
蚂蚁是否要读这一点,让我执行XQuery来拉回值键一个天生的能力?通过API浏览我没有看到这样的功能。
我有以下形式的XML文件 -Ant和XML配置文件解析
<map MAP_XML_VERSION="1.0">
<entry key="database.user" value="user1"/>
...
</map>
蚂蚁是否要读这一点,让我执行XQuery来拉回值键一个天生的能力?通过API浏览我没有看到这样的功能。
您可以使用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做到这一点。
可选的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>
声明:我是作者。
到目前为止,我肯定喜欢这种方法,但我遇到了一个问题。在评估调用它挂起30-40秒,我得到一个javax.script.ScriptException封装一个javax.xml.xpath.XPathExpressionException。即使当我简化查询来选择整个文档时,我也会得到这个结果。有什么想法吗? – PHeath 2009-08-10 20:01:06
我不得不看到你正在使用的XML和xpath查询。上面的示例仅用于选择文本元素。它可能是你试图选择一个节点或节点集。 – Kevin 2009-08-10 20:13:45
它应该返回元素“entry”的属性“value”的值。 xpath查询与您在该示例中放入的内容完全相同。我忽略的唯一的事情是有一个文档类型(<!DOCTYPE map SYSTEM“http://java.sun.com/dtd/preferences.dtd”>)和顶部的标准xml头。 – PHeath 2009-08-10 20:19:00