0

x-pos="NN"y-pos="NN"などの (特に) プロパティを持つ xml 文字列があります。ここで、NNは正または負の数値です。すべての値を読み取り、その算術積に変更したい - 評価 #{NN * 15}、つまり x-pos="3" は x_pos="45" に変更されます。

したがって、次のようなものが必要です。

<ant-contrib:propertyregex  property="xval"
   input="${xmlfile.contents}"
   regexp="x-pos\s*=\s*&quot;([0-9\-]+)&quot;"
   replace="x-pos=&quot;_TRICKY_EXPR_EVALUATOR_{\1 * 15}&quot;"
   override="true" global="yes"/>

または、どうにかしてすべての /x-pos\s*=\s*\"([0-9-]+)\"/ 一致をキャプチャし (PHP の preg_match_all 関数のように)、flaka リストまたは- たとえば - 「;」で区切られた文字列で? 取得したら、それを分割し、反復して各値を「手動で」置き換えることができます。

perl のような正規表現で動作する他の ant 拡張機能はありますか? flaka と ant-contrib について学びましたが、それらは役に立ちません。

ご感想ありがとうございます!

更新: これは、解析する xml の架空のフラグメントです。

<sprite name="timer" xref="" pos-x="25" pos-y="4" path="img/folder1/img1.jpg" />
<sprite name="timer1" xref="" pos-x="25" pos-y="4" offset-x="100" offset-y="10" path="img/folder1/img2.jpg" />
<control name="timer2" xref="" pos-x="25" pos-y="4" size="100" offset-y="10" path="img/folder1/img2.jpg" />
4

2 に答える 2

1

たぶん、すでに使用しているフラカを使用しているとき:

 <!-- Activate flaka for all ant tasks -->
 <fl:install-property-handler/>

と組み合わせ :

#{ x * y}

antcontribが私のマシンにインストールされていないので、何とか動作しますが、テストしませんでした。
プロパティハンドラーを使用すると、すべてのantタスク内でEL式を使用できます。

これは、与えられたファイルfoo.xmlの小さな例で、xmltaskflakaが必要です。

<whatever>
<sprite name="timer" path="img/folder1/img1.jpg" pos-x="25" pos-y="4" xref=""/>
<sprite name="timer1" offset-x="100" offset-y="10" path="img/folder1/img2.jpg" pos-x="26" pos-y="4" xref=""/>
<control name="timer2" offset-y="10" path="img/folder1/img2.jpg" pos-x="27" pos-y="4" size="100" xref=""/>
</whatever>

foo.xmlを適切に編集します:

<project xmlns:fl="antlib:it.haefelinger.flaka">
 <!-- Activate flaka for all ant tasks -->
 <fl:install-property-handler/>
 <!-- Import XMLTask -->
 <taskdef name="xmltask" classname="com.oopsconsultancy.xmltask.ant.XmlTask"/>

 <!-- get a list with all pos-x attribute values -->
 <xmltask source="foo.xml">
   <copy path="//whatever/*/@pos-x" append="true" propertySeparator="," property="posxlist"/>
 </xmltask>
 <echo>$${posxlist} => ${posxlist}</echo>
 <fl:let>counter ::= 1</fl:let>
 <!-- for loop with xmltask editing foo.xml in place => source = dest -->
 <fl:for var="posx" in="split('${posxlist}', ',')">
   <xmltask source="foo.xml" dest="foo.xml" report="true">
     <!-- i.e. multiplicating value * 3 -->
     <attr path="//whatever/*[${counter}]" attr="pos-x" value="#{posx * 3}"/>
   </xmltask>
   <fl:let>counter ::= '${counter}' + 1</fl:let>
 </fl:for>
</project>

出力:

  [xmltask] Cannot append values to properties
  [xmltask] Cannot append values to properties
  [xmltask] Cannot append values to properties
     [echo] ${posxlist} => 25,26,27
  [xmltask] Document -->
  [xmltask] <whatever>
  [xmltask] <sprite name="timer" path="img/folder1/img1.jpg" pos-x="75" pos-y="4" xref=""/>
  [xmltask] <sprite name="timer1" offset-x="100" offset-y="10" path="img/folder1/img2.jpg" pos-x="26" pos-y="4" xref=""/>
  [xmltask] <control name="timer2" offset-y="10" path="img/folder1/img2.jpg" pos-x="27" pos-y="4" size="100" xref=""/>
  [xmltask] </whatever>
  [xmltask] Document <--
  [xmltask] Document -->
  [xmltask] <whatever>
  [xmltask] <sprite name="timer" path="img/folder1/img1.jpg" pos-x="75" pos-y="4" xref=""/>
  [xmltask] <sprite name="timer1" offset-x="100" offset-y="10" path="img/folder1/img2.jpg" pos-x="78" pos-y="4" xref=""/>
  [xmltask] <control name="timer2" offset-y="10" path="img/folder1/img2.jpg" pos-x="27" pos-y="4" size="100" xref=""/>
  [xmltask] </whatever>
  [xmltask] Document <--
  [xmltask] Document -->
  [xmltask] <whatever>
  [xmltask] <sprite name="timer" path="img/folder1/img1.jpg" pos-x="75" pos-y="4" xref=""/>
  [xmltask] <sprite name="timer1" offset-x="100" offset-y="10" path="img/folder1/img2.jpg" pos-x="78" pos-y="4" xref=""/>
  [xmltask] <control name="timer2" offset-y="10" path="img/folder1/img2.jpg" pos-x="81" pos-y="4" size="100" xref=""/>
  [xmltask] </whatever>
  [xmltask] Document <--
BUILD SUCCESSFUL
Total time: 826 milliseconds

警告「プロパティに値を追加できません」は、com.oopsconsultancy.xmltask.CopyAction行80から発生し、antのプロパティは不変であり、安全に無視できることを強調します。または、ソースから削除してxmltask.jarを再構築することをお勧めします。

于 2013-03-11T21:24:06.527 に答える
0

ここに私自身の解決策の断片があります。一般的なテキスト解析の問題 (php の preg_match_all など) を解決しないため、承認済みとしてマークしません。でも、誰かがそれを面白いと思うかもしれません。少し面倒です。ant プロパティと flaka EL 変数を使用していますが、それらを一緒に使用する方法を示しています。コードは次のとおりです。

filename: process.xml

<!-- these includes are needed so that eclipse can load autocompletion base from plugins,
and they tell to ant where plugins' jars are (in 'ut' folder on the same level)-->
<taskdef uri="antlib:it.haefelinger.flaka" resource="it/haefelinger/flaka/antlib.xml" classpath="ut/ant-flaka.jar" />
<taskdef uri="antlib:net.sf.antcontrib" resource="net/sf/antcontrib/antlib.xml" classpath="ut/ant-contrib-1.0b3.jar" />

<!-- call: >> ant -Dfname="folder/with/xmls" -f process.xml correct-xmls -->
<target name="correct-xmls">
    <fl:install-property-handler />
    <property name="slashn" value="${line.separator}" />

    <!-- get xmls - only with existing root resprops element -->
    <fileset dir="${fname}" includes="**/*.xml" id="xml-classes">
        <contains text="&lt;resprops&gt;" />
    </fileset>

    <fl:for var="xn" in="split('${toString:xml-classes}', ';')">
        <fl:let>curfile = file(concat('${fname}','/',xn))</fl:let>
        <fl:let>tgtfile = file(concat('${fname}','/',xn,'.new'))</fl:let>
        <fl:echo>#{ format('file %s, last modified %tD, size: %d',  
            curfile.path, curfile.mtime, curfile.isdir ? 0 : curfile.size) }</fl:echo>

        <fl:unset>xmlfile.contents</fl:unset>
        <loadfile property="xmlfile.contents" srcFile="#{curfile}" />
        <fl:let>outstr = ''</fl:let>
        <fl:for var="str" in="split('${xmlfile.contents}', '\n')">
            <fl:unset> xval </fl:unset>
            <ac:propertyregex property="xval" input="#{str}" regexp="pos-x\s*=\s*&quot;([0-9\-]+)&quot;" select="\1" override="true" />
            <!-- force set property 'resstr' to value of var 'str'-->
            <fl:let>resstr ::= str</fl:let>

            <!-- process only if pos-x is found and we have its value in 'xval' -->
            <fl:when test="not empty '#{property.xval}'">
                <fl:let>outval = (property.xval * 15.5 + 0.5) </fl:let>
                <!-- kinda int-from-float -->
                <ac:propertyregex property="gotv" input="#{outval}" regexp="([0-9\-]+)\." select="\1" override="true" />
                <ac:propertyregex property="resstr"
                                  input="${resstr}"
                                  regexp="pos-x\s*=\s*&quot;([0-9\-]+)&quot;"
                                  replace="pos-x = &quot;#{gotv}&quot;"
                                  override="true"
                />
            </fl:when>

            <!-- add to output string by string -->
            <fl:let> outstr = format('%s%s%s', outstr , resstr, slashn) </fl:let>

        </fl:for>

        <!--save processed file -->
        <echo file="#{tgtfile}" encoding="utf-8">#{outstr}</echo>

    </fl:for>
</target>

于 2013-03-12T12:26:32.323 に答える