2009-08-10 21 views

答えて

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.xml.xpath.XPathExpressionExceptionをラップするjavax.script.ScriptExceptionが発生します。私は、ドキュメント全体を選択するためにクエリを単純化しても、これを取得します。何かご意見は? – PHeath

+0

私はあなたが作業しているXMLとxpathクエリを見なければならないでしょう。上記のサンプルは、テキスト要素を選択するようにのみ設計されています。ノードまたはノードセットを選択しようとしている可能性があります。 – Kevin

+0

要素 "entry"の属性 "value"の値を返す必要があります。 xpathクエリは、ここに示した例と同じです。私が言及しなかったのは、Doctype(<!DOCTYPE map SYSTEM "http://java.sun.com/dtd/preferences.dtd">)と標準のxmlヘッダーが最上部にあることでした。 – PHeath

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> 

免責事項:私は著者です。

関連する問題