3

次のドキュメント内:

<?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

1 に答える 1

4

良い知らせと悪い知らせがありました。悪いニュースは、すぐに使えるソリューションがないことです。良いニュースは、保護されたメソッドxmlpropertyを公開するおかげで、タスクがかなり拡張可能であることです。processNode()できることは次のとおりです。

lib1. ant.jar ( ant ディストリビューションのサブディレクトリにあるものを見つけるか、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 から見えるようにするだけです。最も簡単な方法: taskAnt スクリプトがあるディレクトリにサブディレクトリを作成する -> コンパイル済みの 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. ant を実行すると、次のように表示されます。[echo] name = id17

ここで行ったことは、特定のケースに合わせて特殊な派手な角括弧構文を定義することです:-)。いくつかのより一般的なソリューションタスクの拡張では、もう少し複雑になる場合がありますが、すべてが可能です:)。幸運を。

于 2012-05-07T21:39:15.827 に答える