读取由xpath填充的多维数组的值

时间:2012-12-13 17:28:54

标签: php xml arrays xpath simplexml

我是PHP的新手,我不确定我在这里缺少什么。我有一个多维数组,我使用XPath从XML文件创建。我能够遍历数组并检索大部分值,但是我被困在一个部分。

XML结构示例:

  • MasterNode
    • SubNodeItem1
    • SubNodeItem2
    • SubNodeItem3
    • SubNodeItemList
      • SubListItem
        • SubItemProperty1
        • SubItemProperty2
        • SubItemProperty3
      • SubItemList
        • SubItemProperty1
        • SubItemProperty2
        • SubItemProperty3
    • SubNodeItem4
    • SubNodeItem5

我可以使用以下语法检索任何SubNode值的值:

$val=$XML[$i]->SubNodeItem1;

然而,我不能为我的生活弄清楚如何检索SubListItemProperty的值。

我认为这将是逻辑语法:

$SubItemPropVal=$XML[$i]->SubNodeItemList->SubListItem[$i]->SubItemProperty1;

我搜索了与PHP多数组相关的其他论坛和主题,但未能找到正确的方法来执行此操作。

运行代码时出现"Trying to get property of non-object"错误。我很确定这表明我没有正确指向节点。

1 个答案:

答案 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