我需要在多个xml文件中搜索和替换。我正在寻找一个脚本来完成这项工作,因为我有很多要编辑的文件。例如,
<search position="after" index="0,1,3" offset="2">
<![CDATA[
<?php -- code to be searched -- ?>
]]>
</search>
<add>
<![CDATA[ --code to add here-- ]]>
</add>
I need to change above code to following
<search index="1,2,4">
<![CDATA[
<?php -- code to be searched -- ?>
]]>
</search>
<add position="after" offset="2">
<![CDATA[ --code to add here-- ]]>
</add>
我需要
1.从搜索移动位置并添加标签,位置可以是“替换”,“后”,“之前”。
2.索引标签也应移动添加标签,并在新索引从1开始而不是零时增加
3.移动偏移量以添加标签
据我所知,使用str_replace
搜索特定字符串并替换很容易,但我无法获得如何搜索字符串并替换或追加下一行并在所有以.xml扩展名结尾的文件中迭代它。在php或命令行中执行此操作的最佳方法是什么?
答案 0 :(得分:1)
嗯,首先要做的是编写一个XSLT转换来执行此操作。你真的不想在文本层面尝试这个 - 有太多的方法来解决它,特别是如果有太多的文件来手动检查每一个。 XSLT 2.0代码如下(假设search
和add
周围的包装元素,我将称之为X
)
<xsl:transform version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="X">
<xsl:copy>
<search index="{string-join(for $t in tokenize(search/@index, ',') return string(number($t)+1))}">
<xsl:copy-of select="search/node()"/>
</search>
<add position="{search/@position}" offset="{search/@offset}">
<xsl:copy-of select="add/node()"/>
</add>
</xsl:copy>
</xsl:template>
</xsl:transform>
然后,您需要将其应用于目录中的所有文件。如果您使用Saxon,可以从命令行执行此操作:指定-s:input-dir -o:output-dir
。