2

我对 PHP 有点陌生,我不确定我在这里缺少什么。我有一个使用 XPath 从 XML 文件创建的多维数组。我能够在数组中移动并检索大多数值,但我被困在一个部分。

XML 结构示例:

  • 主节点
    • 子节点项1
    • 子节点项2
    • 子节点项 3
    • 子节点项列表
      • 子列表项
        • 子项属性 1
        • 子项属性 2
        • 子项属性 3
      • 子项列表
        • 子项属性 1
        • 子项属性 2
        • 子项属性 3
    • 子节点项4
    • 子节点项5

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

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

但是,我无法终生弄清楚如何检索SubListItemProperty.

我认为这将是逻辑语法:

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

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

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

4

1 回答 1

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

于 2012-12-13T17:38:14.343 回答