2013-01-15 53 views
0

我堅持這一點,無法在網上找到答案。我想使用DOM來加載XML。 我有下列方案的XML:DOM XML解析限制結果值

<type1> 
    <other>...</other> 
    <number>bla</number> 
    <other>...</other> 
</type1> 
<type1> 
    <other>...</other> 
    <number>bla</number> 
    <other>...</other> 
</type1> 
... 
<type2> 
    <other>...</other> 
    <number>bla</number> 
    <other>...</other> 
</type2> 
<type2> 
    <other>...</other> 
    <number>bla</number> 
    <other>...</other> 
</type2> 

Type1和Type2的兩個數據發生多次。標籤號碼出現在兩種類型中。 當我使用

$searchNode = $xmlHandler->getElementsByTagName("number"); 

我得到這兩種類型的數字。我怎樣才能得到type1或type2的數字?

更新: 基於Kami和Ikku的建議,我已經爲DOM解決了它。下面的工作代碼:

<?php 
$xmlHandler = new DOMDocument(); 
$xmlHandler->load("xmldocumentname.xml"); 

$xpath = new DOMXPath($xmlHandler); 
$searchNodes = $xpath->query("/type1"); 
foreach($searchNodes as $searchNode) { 
    $xmlItem = $searchNode->getElementsByTagName("number"); 
    $number = $xmlItem->item(0)->nodeValue; 
    $xmlItem = $searchNode->getElementsByTagName("other"); 
    $other = $xmlItem->item(0)->nodeValue; 

    echo "NUMBER=" . $number . "<br>"; 
    echo "OTHER=" . $other . "<br>"; 

} 
?> 

回答

2

您需要擴大搜索範圍才能考慮父母的具體價值。 getElementsByTagName將您限制爲您正在查找的標籤的名稱,因此無法進行一般搜索。使用更普遍的搜索。我在下面的示例中使用simplexml庫中的xpath

$xmlHandler = simplexml_load_file("somexmlfile.xml"); 

$searchNode = $xmlHandler->xpath("type1/number"); // Gets type1 numbers 
$searchNode = $xmlHandler->xpath("type2/number"); // Gets type2 numbers 

要做同樣的事情 - 有一個額外的步驟來創建一個xpath對象,但這是要求使搜索更容易。

// Create new DOM object: 
$dom = new DomDocument(); 
$dom->loadXML($xml); 

$xpath = new DOMXPath($dom); 
$searchNode = $xpath->query("type1/number"); 
$searchNode = $xpath->query("type2/number"); 

以上是未經測試;根據需要修改。

+0

我正在尋找一個DOM解決方案,但我想這個simplexml解決方案背後的想法是可行的。我會試試看,謝謝。 – Vincent

+0

@Vincent這也可以使用DOM - 我已經爲你創建了一個樣本。 – Kami

+0

我剛剛在DOM中完成它。它效果很好。 Kami mucho謝謝。 – Vincent

1

我猜首先搜索所有需要的類型(1或2),然後在該結果集搜索所需的標記名。因此,可以將兩個步驟合併成一個單獨的行,您需要檢查兩個步驟是否可以優化。

+0

我明白你的意思,我會結合上面的答案。謝謝\ – Vincent