我是PHP的新手,我不确定我在这里缺少什么。我有一个多维数组,我使用XPath从XML文件创建。我能够遍历数组并检索大部分值,但是我被困在一个部分。
XML结构示例:
我可以使用以下语法检索任何SubNode值的值:
$val=$XML[$i]->SubNodeItem1;
然而,我不能为我的生活弄清楚如何检索SubListItemProperty
的值。
我认为这将是逻辑语法:
$SubItemPropVal=$XML[$i]->SubNodeItemList->SubListItem[$i]->SubItemProperty1;
我搜索了与PHP多数组相关的其他论坛和主题,但未能找到正确的方法来执行此操作。
运行代码时出现"Trying to get property of non-object"
错误。我很确定这表明我没有正确指向节点。
答案 0 :(得分:1)
我的建议是保留XML文件,显然已经正常工作,并使用它。
将其元素转换为数组对我来说没有多大意义。
编辑:OP实际上并不使用数组,而是使用SimpleXML对象。
XPath在从XML文档中选择所需的位时非常灵活和强大:
$doc = new DOMDocument();
$doc->loadXML($your_xml);
$xp = new DOMXPath($doc);
// for example
$result = $xp->query("//SubListItem[2]/SubItemProperty1");
if ($result->length)
{
echo $result->item(0)->textContent;
}
SimpleXML也可以工作:
$xml = simplexml_load_string($result);
// either this ($node will be an array of matches, or FALSE)
$node = $xml->xpath("//SubNodeItemList/SubListItem[1]/SubItemProperty1");
// or this (unless you add a number, [0] will be assumed)
$node = $xml->SubNodeItemList->SubListItem->SubItemProperty1;
重要提示:数组表示法从0
计算,而XPath始终从1
计算。
请注意,当文档结构不符合您的代码要求时,第二个选项(数组表示法)将抛出运行时错误。
使用XPath时,根本就没有返回值,这更容易处理(不需要try / catch块,if ($node) { ... }
就足够了)。
另请注意,使用SimpleXML,文档元素(<MasterNode>
)将成为文档。因此,您不会使用$xml->MasterNode->SubNodeItemList
,而是使用$xml->SubNodeItemList
。