2009-08-10 147 views
4

我有以下形式的XML文件 -Ant和XML配置文件解析

<map MAP_XML_VERSION="1.0"> 
    <entry key="database.user" value="user1"/> 
    ... 
</map> 

螞蟻是否要讀這一點,讓我執行XQuery來拉回值鍵一個天生的能力?通過API瀏覽我沒有看到這樣的功能。

回答

8

您可以使用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> 
+0

到目前爲止,我肯定喜歡這種方法,但我遇到了一個問題。在評估調用它掛起30-40秒,我得到一個javax.script.ScriptException封裝一個javax.xml.xpath.XPathExpressionException。即使當我簡化查詢來選擇整個文檔時,我也會得到這個結果。有什麼想法嗎? – PHeath 2009-08-10 20:01:06

+0

我不得不看到你正在使用的XML和xpath查詢。上面的示例僅用於選擇文本元素。它可能是你試圖選擇一個節點或節點集。 – Kevin 2009-08-10 20:13:45

+0

它應該返回元素「entry」的屬性「value」的值。 xpath查詢與您在該示例中放入的內容完全相同。我忽略的唯一的事情是有一個文檔類型(<!DOCTYPE map SYSTEM「http://java.sun.com/dtd/preferences.dtd」>)和頂部的標準xml頭。 – PHeath 2009-08-10 20:19:00

0

聽起來像你想要的東西像ant-xpath-task。我不知道有什麼內置的方式來與Ant做到這一點。

10

可選的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> 

聲明:我是作者。