我需要在多个 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 代码如下(假设有一个围绕 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
。
关于php - 在多个文件中有条件地替换 XML 标签,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40642724/