我有以下形式的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