2013-01-15 54 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