在多个文件中有条件地替换XML标记

时间:2016-11-16 21:31:41

标签: php xml linux

我需要在多个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或命令行中执行此操作的最佳方法是什么?

1 个答案:

答案 0 :(得分:1)

嗯,首先要做的是编写一个XSLT转换来执行此操作。你真的不想在文本层面尝试这个 - 有太多的方法来解决它,特别是如果有太多的文件来手动检查每一个。 XSLT 2.0代码如下(假设searchadd周围的包装元素,我将称之为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