2016-11-16 86 views
0

我需要在多個xml文件中進行搜索和替換。我正在尋找編寫腳本來完成這項工作,因爲我有許多文件需要編輯。例如,在多個文件中有條件替換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

那麼,首先要做的就是編寫一個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

+0

我很抱歉,但我不熟悉XSLT轉換或知道如何使用它。這些XML文件是修改系統,我們從修改到核心PHP文件。你能告訴我,如果申請這是一個簡單的過程,如果我需要開始這將是這樣做的最佳起點?謝謝 –

+0

如果你操縱XML,那麼你需要掌握XSLT,就像你在做木工一樣,你需要學習使用鋸子和鑿子。這有一條學習曲線,但你會花費更多的時間用錯誤的工具來完成這項工作,而不是讓你學習正確的工具。 –