2010-09-26 93 views
0

如何編寫正則表達式以從xml節點檢索值? 其實節點結構非常大。所以我們不能輕易地遍歷,所以我想讀爲普通文本文件,並希望我可以寫一個正則表達式來找出匹配的元素。PHP:使用正則表達式從xml屬性中查找和檢索值

<node1> 
<node2>str</node2> 
<node3>Text</node3> 
<myvalue>Here is the values string..</myvalue> 
</node1> 

以上是我想要檢索值<myvalue></myvalue>的模式,但在我的xml有這麼多其他的節點包含<myvalue>孩子。所以只有這樣才能找到我想要的適當節點是上述模式。節點值剩餘值的唯一變化是相同的<node2>str</node2>,<node3>Text</node3>總是相同的。

那麼我該如何寫php的正則表達式呢?

+0

顯示XML文檔的一個真實的例子,包括有問題的區域(許多'myvalue'節點,結構複雜等)。 – salathe 2010-09-26 19:49:01

回答

2

使用XML解析器,Regex不適合做這種解析。

這裏的XML解析器的列表,你可以使用:

這裏有一個簡單的例子與DOM將找到位於的所有。

<?php 
    $document = new DOMDocument(); 
    $document->loadXML(
     '<all> 
      <myvalue>Elsewhere</myvalue> 
      <node1> 
       <node2>str</node2> 
       <node3>Text</node3> 
       <myvalue>Here is the values string..</myvalue> 
      </node1> 
     </all>'); 
    $lst = $document->getElementsByTagName('node1'); 

    for ($i=0; $i<$lst->length; $i++) { 
     $node1= $lst->item($i); 
     $myvalue = $node1->getElementsByTagName('myvalue'); 

     if ($myvalue->length > 0) { 
      echo $myvalue->item(0)->textContent; 
     } 
    } 
?> 
+0

但找到該節點是有點困難的任務..這就是爲什麼我更喜歡regx – coderex 2010-09-26 18:07:23

+0

@coderex這很容易,你一定會得到準確的結果每次。 – HoLyVieR 2010-09-26 18:08:34

+0

@coderex您可以使用XPath在解析XML時進行搜索,例如使用SimpleXML:http://www.tuxradar.com/practicalphp/12/3/3 – Fanis 2010-09-26 18:12:08

1

PHP有一個基於SAX的XML解析器,它可以讓你使用真正的XML解析器,而不需要在內存中存儲整個DOM樹。使用XMLReader可以在不將整個文件讀入內存的情況下解析文件。使用正則表達式挖掘XML將會很痛苦。

0

如果您堅持使用正則表達式,請嘗試

preg_match_all('<myvalue>([\s\S]+)<\/myvalue>', $text, $matches); 
+0

但我需要檢查這一點 – coderex 2010-09-26 19:24:46

+0

preg_match_all( ' str <\/node2> Text <\/node3>([\ s \ S] +)<\/myvalue>'$ text,$ matches); – coderex 2010-09-26 19:25:44

+0

但在xml中,每個節點都有一個新的行char,它認爲,所以在這種情況下我的嘗試失敗。所以現在我需要刪除換行符的空格 – coderex 2010-09-26 19:27:00