0

我对此感到困惑,无法在网上找到答案。我想使用 DOM 来加载 XML。我有一个具有以下方案的 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>";

}
?> 
4

2 回答 2

2

您需要扩展搜索以允许父级的特定值。将getElementsByTagName您限制为您正在寻找的标签的名称,因此它无法进行一般搜索。使用更通用的搜索。我在下面的示例中xpathsimplexml库中使用。

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

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

对 DOM 做同样的事情 - 有一个额外的步骤来创建一个 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");

以上内容未经测试;所以根据需要修改。

于 2013-01-15T12:42:39.620 回答
1

我想首先搜索所有必需的类型(1 或 2),然后在该结果集上搜索所需的标记名。所以一个两步过程,可能合并在一行中,你必须检查你是否可以在两步工作时优化它。

于 2013-01-15T12:41:14.543 回答