Regex 是否使用ant或ant扩展名将每个xml数值属性替换为其字符串算术乘积?
我有一个带有(除其他外)属性的xml字符串,例如x-pos=“NN”和y-pos=“NN”,其中NN是一个正数或负数。 我想读取每个值,并将其更改为算术乘积-求值#{NN*15},即x-pos=“3”将更改为x#u pos=“45” 因此我需要这样的东西:Regex 是否使用ant或ant扩展名将每个xml数值属性替换为其字符串算术乘积?,regex,ant,text-parsing,ant-contrib,flaka,Regex,Ant,Text Parsing,Ant Contrib,Flaka,我有一个带有(除其他外)属性的xml字符串,例如x-pos=“NN”和y-pos=“NN”,其中NN是一个正数或负数。 我想读取每个值,并将其更改为算术乘积-求值#{NN*15},即x-pos=“3”将更改为x#u pos=“45” 因此我需要这样的东西: <ant-contrib:propertyregex property="xval" input="${xmlfile.contents}" regexp="x-pos\s*=\s*"([0-9\-]+)
<ant-contrib:propertyregex property="xval"
input="${xmlfile.contents}"
regexp="x-pos\s*=\s*"([0-9\-]+)""
replace="x-pos="_TRICKY_EXPR_EVALUATOR_{\1 * 15}""
override="true" global="yes"/>
或者我可以以某种方式捕获所有的/x-pos\s*=\s*\“([0-9-]+)\”/matches(就像在PHP preg\u match\u 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" />
可能在使用flaka时已经使用:
<!-- Activate flaka for all ant tasks -->
<fl:install-property-handler/>
我的机器上没有安装antcontrib,因此没有对其进行测试,它将以某种方式为您工作。属性处理程序允许在所有ant任务中使用EL表达式。
下面是一个小示例,其中包含一个给定的文件foo.xml,需要和:
就地编辑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>
$${posxlist}=>${posxlist}
计数器::=1
计数器::='${counter}'+1
输出: [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
[xmltask]无法将值附加到属性
[xmltask]无法将值附加到属性
[xmltask]无法将值附加到属性
[echo]${posxlist}=>25,26,27
[xmltask]文档-->
[xmlstask]
[xmlstask]
[xmlstask]
[xmlstask]
[xmlstask]
[xmltask]文档
[xmlstask]
[xmlstask]
[xmlstask]
[xmlstask]
[xmlstask]
[xmltask]文档
[xmlstask]
[xmlstask]
[xmlstask]
[xmlstask]
[xmlstask]
[xmltask]Document这里是我自己解决方案的一部分。我不会将其标记为已接受,因为它不能解决一般的文本解析问题(如php的preg_match_all)。但也许有人会觉得有趣。
这有点混乱-我使用ant属性和flaka EL变量,但它说明了如何将它们结合使用。
代码如下:
filename: process.xml
curfile=file(concat('${fname}','/',xn))
tgtfile=file(concat('${fname}','/',xn'.new'))
#{格式('文件%s,上次修改的%tD,大小:%d',
curfile.path,curfile.mtime,curfile.isdir?0:curfile.size)}
xmlfile.contents
突出部分=“”
xval
resstr::=str
outval=(property.xval*15.5+0.5)
outsr=格式(“%s%s%s”,outsr,resstr,slashn)
#{outstr}
对于解析xml,不应使用regexp。使用xmltask()并通过xpath获取所有x-pos节点的列表。之后,可以很容易地迭代该列表。请编辑您的答案并显示xmlstructure,我将发布一个解决方案。@Rebase,重点是xml结构无关紧要。它是一类任务,而不是单个任务(不仅仅针对xml)。我知道使用propertyregex的特定于结构的解决方案-逐个字符串和逐个属性解析字符串。但它不是通用的,如果有一些扩展可以使flaka列表更容易。无论如何,我想看看你的具体解决方案。所以我将更新我的问题。最后我有时间发布一些示例,请参阅我的答案-HTHThaks以了解解决方案。虽然它是原始的,没有涵盖很多用例,但我很感谢您发布它,xmltask对我来说是新的和有前途的。当它变得复杂时,您需要一种真正的编程语言,在ant=>中通过task使用Groovy乍一看就像我搜索的一样,thanx会记住并添加书签!
[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
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="<resprops>" />
</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*"([0-9\-]+)"" 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*"([0-9\-]+)""
replace="pos-x = "#{gotv}""
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>