我坚持这个,无法在网上找到答案。我想使用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>";
}
?>
答案 0 :(得分:2)
您需要扩展搜索以允许父级的特定值。 getElementsByTagName
将您限制为您要查找的代码的名称,因此无法进行常规搜索。使用更通用的搜索。我在下面的示例中使用xpath
库中的simplexml
。
$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");
以上未经测试;所以根据需要进行修改。
答案 1 :(得分:1)
我想首先搜索所有必需的类型(1或2),然后在该结果集上搜索所需的标记名。因此,可以在一行中组合一个两步流程,您必须检查在两个步骤工作时是否可以对其进行优化。