2012-03-01 23 views
1

私はアンドロイドのビルドプロセスを自動化しようとしています。そのために、XMLファイルでアプリ名を変更したいと思います。コードはこのAntを使用してXMLファイルの値を置換する

<resources> 
    <string name="app_name">Realta Connections</string> 
</resources> 

のようなものである今私はビルド時に何か他のもの、私はビルド時に与える名前で名「Realta接続」を交換したいです。名前は 'Realta Connections'なので、name = "app_name"を検出し、その内容を置き換える必要があります。私はそれをする方法を探してみましたが、正確な方法を見つけることができませんでした。どうやってやるの?助けてください。

+0

のために働くあなたは解決策を見つけましたか? – Jovan

答えて

2

固定値を持つのが最も簡単な場合がありますが、これは置き換えられます。これにより、置換タスクを使用できます。 xml文字のため、replacetoken/replacevalue![CDATA[]]の文字列が必要です。

<replace casesensitive="false" 
    file="../KS.build/ivy.properties"> 
    <replacetoken><![CDATA[<string name="app_name">Realta Connections</string>]]></replacetoken> 
    <replacevalue><![CDATA[<string name="app_name">Something else</string>]]></replacevalue> 
    </replace> 

は、そうでない場合(ネストされたCDATAの交換を許可していませんrepleaceregex)は、通常のアリソリューションはありません。

リンク:

+0

私はそれがRealta Connectionsの代わりに何でもできると頼んでいました。だから私は値が何であるか知りません。だから私はname = "app_name"に達する必要があり、次に内部のものを置き換える必要があります。 – ghostCoder

+0

これには標準のantタスクはありません。固定名を使用するか、独自のタスクを作成する必要があります – oers

1

私はこの質問はかなり古いですけど、ここでの考え方です。これは本当に純粋なantソリューションではないようですが、<scriptdef>タグを使用してantにスクリプトを埋め込むことができます。ここで

を使用すると、XMLファイルで何かを検索し、プロパティに結果を格納するために使用できる機能です。

<scriptdef name="xpath-query" language="javascript"> 
     <attribute name="query"/> 
    <attribute name="xmlfile"/> 
    <attribute name="property"/> 
    <![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); 
     importClass(java.lang.System); 


     var exp = attributes.get("query");   
     var filename = attributes.get("xmlfile"); 
     var xpath = XPathFactory.newInstance().newXPath();   
     var input = new InputSource(new FileInputStream(filename)); 
     var value = xpath.evaluate(exp, input, XPathConstants.STRING);   
     self.project.setProperty(attributes.get("property"), value);   
     System.out.println("Copied this value:" + value + " to this property:" + attributes.get("property")); 

    ]]> 
</scriptdef> 

次に、あなたは、XPathクエリを使用して、アプリケーションの現在の名前を得ることができますあなたが定義したタスク:

<xpath-query query='pathToResources\resources\string[@name="app_name"]' xmlFile="app.xml" property="appName" /> 

次に、アプリケーション名はプロパティappNameに保存されます。

そこから、アプリ名を使ってxmlファイルのregex replaceを行うことができます。

<replaceregexp file="app.xml" match="${appName}" replace="${newAppName}" /> 

ダウンサイドこの特定のアプローチの可能性は、あなたがXMLファイルのどこかに同じアプリ名の文字列を持っている場合、正規表現で置き換えることであることは、あなたが意図していなかった何かを置き換えることができます。

おそらく<scriptdef>を定義して、プロパティで見つかったものを格納するのではなく、置き換えを行うことができますが、私はこの部分を手軽に手に入れました。

0

このコードを試すには、それは私

<target name="change-app-name"> 
    <replaceregexp file="res/values/strings.xml" match='name="app_name"(.*)' 
     replace='name="app_name"&gt;Something Else&lt;\/string&gt;'/> 
</target> 
関連する問題