2017-05-02 31 views
1

鄰居內容我有這樣的XML:的Symfony2 - DomCrawler - 獲取元素的內容通過它在正則表達式

<Item id="3" idLevel="3"> 
    <Label qualifier="Usual"> 
     <LabelText language="ALL">BE01</LabelText> 
    </Label> 
    <Label qualifier="Usual"> 
     <LabelText language="EN">R&#xc9;GION DE BRUXELLES-CAPITALE/BRUSSELS HOOFDSTEDELIJK GEWEST</LabelText> 
    </Label> 
</Item> 
<Item id="4" idLevel="3"> 
    <Label qualifier="Usual"> 
     <LabelText language="ALL">BE001</LabelText> 
    </Label> 
    <Label qualifier="Usual"> 
     <LabelText language="EN">VLAAMS GEWEST</LabelText> 
    </Label> 
</Item> 
<Item id="123" idLevel="3"> 
    <Label qualifier="Usual"> 
     <LabelText language="ALL">RO001</LabelText> 
    </Label> 
    <Label qualifier="Usual"> 
     <LabelText language="EN">MACROREGIUNEA DOI</LabelText> 
    </Label> 
</Item> 

我想取一個<LabelText language="EN">的值,其中鄰居<LabelText language="ALL">開始與「是」,有3個數字之後。

在這種情況下,我會得到例如在第二個XML元素的值:佛蘭芒行政自治區

我有一個想法如何接近它uggly方式,但我認爲應該有更加靈活和優雅的方式來做到這一點:

$crawler = new Crawler(); 
$crawler->addXmlContent($xml); 
$crawler = $crawler->filterXPath('//Item[@idLevel="3"]'); 

foreach ($crawler as $domElement) { 
    // here I check if inside element's neighbour has value of "BE" and three numbers after with regex 
} 

有沒有辦法用DomCrawler代替迭代所有元素,並檢查每個處理呢?

回答

2

您可以使用一個XPath表達式,將得到公正所要求的文本:

//Item[@idLevel="3"]/Label[string-length(preceding-sibling::Label/LabelText/text()) = 5 and starts-with(preceding-sibling::Label/LabelText/text(), "BE") and number(substring(preceding-sibling::Label/LabelText/text(), 3)) = number(substring(preceding-sibling::Label/LabelText/text(), 3))]/LabelText[@language="EN"]/text() 

其分解:

  • //Item[@idLevel="3"] - 獲得與idLevel屬性與價值Item節點3
  • /Label - 它的Label孩子們有...
  • [string-length(preceding-sibling::Label/LabelText/text()) = 5 - 兄弟姐妹文本長度Label/LabelText節點等於5 ...
  • and starts-with(preceding-sibling::Label/LabelText/text(), "BE") - 並具有文本開始BE
  • and number(substring(preceding-sibling::Label/LabelText/text(), 3)) = number(substring(preceding-sibling::Label/LabelText/text(), 3))] - 最後3個字符是數字
  • /LabelText[@language="EN"]/text() - 得到的文本LabelText節點具有language屬性具有文本EN
+0

Briliant!感謝您提供解釋 –

+0

btw,我可以在哪裏找到有關filterXPath內部這些條件的文檔?我需要擴大一點。 –

+0

我覺得這裏有很多資源。 (Un)?幸運的是,我必須在專門的基礎上學習XPath。我曾經諮詢過http://zvon.org([這裏是一個Zvon XPath教程](http://zvon.org/comp/r/tut-XPath_1.html))。但是,這裏也有很多好東西。順便說一句,你如何調整表情? –