2012-05-07 64 views
3

內的下列文件解析XML文檔中的字符串:使用Ant

<?xml version="1.0" encoding="utf-8"?> 
<resources> 
<string name="toc">section</string> 
<string name="id">id17</string> 
</resources> 

如何返回值:ID17

當我運行下面的目標在我的Ant文件:

<target name="print" 
    description="print the contents of the config.xml file in various ways" > 

    <xmlproperty file="$config.xml" prefix="build"/> 
    <echo message="name = ${build.resources.string}"/> 
    </target> 

我得到 -

print: 
     [echo] name = section,id17 

有沒有辦法指定我只需要資源「ID」?

回答

4

我對你有個好消息和壞消息。壞消息是沒有開箱即用的解決方案。好消息是,xmlproperty任務是相當可擴展的感謝揭露processNode()方法作爲保護。這裏是你可以做什麼:

1.創建和編譯的ant.jar(你可以找到一個在lib子目錄在你的螞蟻分佈或get it from Maven)在類路徑下面的代碼:

package pl.sobczyk.piotr; 

import org.apache.tools.ant.taskdefs.XmlProperty; 
import org.w3c.dom.NamedNodeMap; 
import org.w3c.dom.Node; 

public class MyXmlProp extends XmlProperty{ 

@Override 
public Object processNode(Node node, String prefix, Object container) { 
    if(node.hasAttributes()){ 
     NamedNodeMap nodeAttributes = node.getAttributes(); 
     Node nameNode = nodeAttributes.getNamedItem("name"); 
     if(nameNode != null){ 
      String name = nameNode.getNodeValue(); 

      String value = node.getTextContent(); 
      if(!value.trim().isEmpty()){ 
       String propName = prefix + "[" + name + "]"; 
       getProject().setProperty(propName, value); 
      } 
     } 
    } 

    return super.processNode(node, prefix, container); 
} 

} 

2.現在你只需要讓這個任務對螞蟻可見。最簡單的方法:在你有ant腳本的目錄中創建task子目錄 - >將編譯好的MyXmlProp類與它的目錄結構拷貝到task目錄,這樣你最終應該得到如下結果:task/pl/sobczyk/peter/MyXmlProp.class

3.導入任務Ant腳本,你應該像結束了:

<target name="print"> 
    <taskdef name="myxmlproperty" classname="pl.sobczyk.piotr.MyXmlProp"> 
    <classpath> 
     <pathelement location="task"/> 
    </classpath> 
    </taskdef> 
    <myxmlproperty file="config.xml" prefix="build"/> 
    <echo message="name = ${build.resources.string[id]}"/> 
</target> 

4.運行螞蟻,螞蟻瞧,你應該看到:[echo] name = id17

我們在這裏所做的是爲您的特定情況定義一個特殊的花式方括號語法:-)。對於一些更一般的解決方案任務擴展可能會更復雜一點,但一切皆有可能:)。祝你好運。

+0

感謝您的詳細回覆。我會回覆結果。 – VARoadstter

+0

正是我在找什麼! :) – splash