2014-02-13 77 views
0

我有一個大XML文件。我正在解決一些問題,並且我想從XML文件中提取特定的節點。我不想要一個SimpleXML對象,我想用原始字符串匹配我想要的(在bash/sed/php上發佈)創建一個新文件。正則表達式來提取純文本XML節點

<?xml version="1.0" encoding="UTF-8"?> 
<definition></definition> 
    <metadata></metadata> 
    <nodeToRegex> 
     <nodeImightwant> 
      <subnode> 
       <subsubnode1></subsubnode1> 
       <subsubnodeToCheck>stringCheck</subnodeToCheck> 
       <subsubnode2></subsubnode2> 
      </subnode> 
     </nodeImightwant> 
     <nodeImightwant></nodeImightwant> 
     <nodeImightwant></nodeImightwant> 
    </nodeToRegex> 

因此,從這個XML文件中,我需要除nodeToRegex之外的每個節點的所有行。從nodeToRegex中,如果stringCheck字符串等於「aValidString」,我只需要nodeImightwant。這可以通過正則表達式來完成,還是應該將文件複製粘貼出來? (我的正則表達式技能是欠佳的)

+1

對於一些原因(查找*例如Cthulhu regex *),使用正則表達式來解析XML並不是一個好主意。這是不可維護的,很快就會失控。您最好使用現有的衆多經過充分測試的XML解析解決方案之一。 – Nit

回答

1

Don't parse XML with regexes。沒有理由不能使用SimpleXML重新打包/重新排列數據,但試圖用正則表達式來處理數據是一個令人頭痛的問題,最終導致破壞代碼。

See this classic example爲什麼用正則表達式解析XML/HTML/XHTML是通向瘋狂的道路。

如果你堅持使用正則表達式,只需更換你不想要的節點,就像這樣:

$myxml = preg_replace('~<nodeToRegex>.*?</nodeToRegex>~', '', $myxml); 

Regular expression visualization

Debuggex Demo

+0

我結束了閱讀文件並遍歷節點,直到我提取了我感興趣的那些文件。我實際上並沒有用RegEx解析,我只是需要提取這些節點來獲得工作導入器(所有其他節點當前導入精細)。我用SimpleXML,FWIW做了我的進口商部分 – user3258505