2016-03-03 18 views
0

我有一個格式,比如這個數據的XML文件的父母迭代:腓的XPath通過具有相同的名稱作爲自己的孩子

<area area_id="7" countrycode="" name="Europe"> 
    <area area_id="9" countrycode="ALB" name="Albania"/> 
    <area area_id="12" countrycode="AND" name="Andorra"/> 
    <area area_id="17" countrycode="ARM" name="Armenia"/> 
    <area area_id="20" countrycode="AUT" name="Austria"/> 
    <area area_id="21" countrycode="AZE" name="Azerbaijan"/> 
    <area area_id="26" countrycode="BLR" name="Belarus"/> 
    <area area_id="27" countrycode="BEL" name="Belgium"/> 
    <area area_id="33" countrycode="BIH" name="Bosnia and Herzegovina"/> 
    <area area_id="38" countrycode="BGR" name="Bulgaria"/> 
    <area area_id="56" countrycode="HRV" name="Croatia"/> 
    <area area_id="58" countrycode="CYP" name="Cyprus"/> 
    <area area_id="59" countrycode="CZE" name="Czech Republic"/> 
    <area area_id="61" countrycode="DNK" name="Denmark"/> 
    <area area_id="68" countrycode="ENG" name="England"/> 
    <area area_id="71" countrycode="EST" name="Estonia"/> 
    <area area_id="73" countrycode="FRO" name="Faroe Islands"/> 
    <area area_id="75" countrycode="FIN" name="Finland"/> 
    <area area_id="76" countrycode="FRA" name="France"/> 
    <area area_id="79" countrycode="GEO" name="Georgia"/> 
    <area area_id="80" countrycode="DEU" name="Germany"/> 
    <area area_id="82" countrycode="GRC" name="Greece"/> 
</area> 
<area area_id="92" countrycode="OTR" name="Other"/> 
    <area area_id="93" countrycode="ISL" name="Iceland"/> 
    <area area_id="98" countrycode="IRL" name="Republic of Ireland"/> 
    <area area_id="99" countrycode="ISR" name="Israel"/> 
    <area area_id="100" countrycode="ITA" name="Italy"/> 
    <area area_id="104" countrycode="KAZ" name="Kazakhstan"/> 
    <area area_id="111" countrycode="LVA" name="Latvia"/> 
    <area area_id="116" countrycode="LIE" name="Liechtenstein"/> 
</area> 

我如何遍歷在PHP使用XPath thoroug每個父區域節點(可以有很多)和他們的孩子。

事情是父母的

foreach parent_area 
    foreach parent_area->area 
     do something 

相同的名稱和孩子如果您附上XML以上<root>元素,並修復XML是有效的困惑我

+1

不清楚你想要什麼。爲什麼xpath?請SO搜索一下,寫一些代碼,測試,如果有問題回來編輯你的問題。 – michi

回答

1

下面是根據使用兩種方式。可以嵌套的表達,並使用節點從外表達作爲內表達的上下文。

$xml = <<<'XML' 
<root> 
    <area area_id="7" countrycode="" name="Europe"> 
    <area area_id="9" countrycode="ALB" name="Albania"/> 
    <area area_id="12" countrycode="AND" name="Andorra"/> 
    <area area_id="17" countrycode="ARM" name="Armenia"/> 
    <area area_id="20" countrycode="AUT" name="Austria"/> 
    </area> 
    <area area_id="92" countrycode="OTR" name="Other"> 
    <area area_id="93" countrycode="ISL" name="Iceland"/> 
    <area area_id="98" countrycode="IRL" name="Republic of Ireland"/> 
    <area area_id="99" countrycode="ISR" name="Israel"/> 
    </area> 
</root> 
XML; 

$document = new DOMDocument(); 
$document->loadXml($xml); 
$xpath = new DOMXpath($document); 

foreach ($xpath->evaluate('/*/area') as $area) { 
    echo $area->getAttribute('name'), "\n"; 
    foreach ($xpath->evaluate('area', $area) as $subArea) { 
    echo '* ', $subArea->getAttribute('name'), "\n"; 
    } 
} 

輸出:

Europe 
* Albania 
* Andorra 
* Armenia 
* Austria 
Other 
* Iceland 
* Republic of Ireland 
* Israel 

或者你在一個表達式組合多個位置路徑的一次獲取所有節點。如果您有多個嵌套級別,這非常有用。

foreach ($xpath->evaluate('/*/area|/*//area[parent::area]') as $area) { 
    echo str_repeat('* ', $xpath->evaluate('count(ancestor::area)', $area)); 
    echo $area->getAttribute('name'), "\n"; 
} 
0

(請注意缺少「/」在在我的代碼「其他」)的標籤結束:

<root> 
    <area area_id="7" countrycode="" name="Europe"> 
    ... 
    <area area_id="92" countrycode="OTR" name="Other"> 
     ... 
     <area area_id="116" countrycode="LIE" name="Liechtenstein"/> 
    </area> 
</root> 

,你可以使用例如Xpath的這段代碼遍歷XML:

$str = file_get_contents(<file>); 
$xml = new SimpleXMLElement($str); 
$result = $xml->xpath('/root/area'); 
while(list(, $node) = each($result)) { 
    foreach ($node->attributes() as $a => $b) { 
     echo "{$a} -> {$b}<br />\n"; 
    } 
    $result2 = $node->xpath('area'); 
    while(list(, $node2) = each($result2)) { 
     foreach ($node2->attributes() as $a => $b) { 
      echo "---> {$a} -> {$b}<br />\n"; 
     } 
    } 
} 
相關問題