php - 在多个文件中有条件地替换 XML 标签

标签 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.从搜索中移动位置并添加标签,位置可以是'replace','after','before'。

2. 索引标签也应该移动到添加标签,并且随着新索引从1开始而不是从零开始递增

3. 移动偏移以添加标签

据我所知,使用 str_replace 搜索特定字符串并进行替换很容易,但我不知道如何搜索字符串并替换或追加下一行并在所有以结尾的文件中迭代它.xml 扩展名。在 php 或命令行中最好的方法是什么?

最佳答案

好吧,首先要做的是编写一个 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

关于php - 在多个文件中有条件地替换 XML 标签,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40642724/

相关文章:

linux - Clang OpenGL 和 Max

php - 如何根据不同条件从表中获取行数

php - XML 命名空间前缀冲突的 XPath 行为

xml - XSL使用其包含元素的位置更新属性

java - 如何从一段XML JAVA中获取包含在CDATA标签中的文本内容

linux - 现在可以进行返回 libc 攻击吗?

php - Android、PHP 和 JSON 之间的多个查询问题

php - 使用带有 JOIN 语句的 RealURL (TYPO3)

java - 如何更改 java 文件中的 XML 按钮属性?

linux - gstreamer tcpclientsink 连接被拒绝