SimpleXML - 如何将属性用作选择器?

时间:2011-06-01 23:17:57

标签: php simplexml

鉴于此XML:

<?php
$xml = <<<XML
<?xml version="1.0" encoding="UTF-8" ?>
    <root>
        <project type="residential">
            <item>
                <description><![CDATA[Node 1 text]]></description>
            </item>
            <item>
                <description><![CDATA[Node 2 text]]></description>
            </item>
        </project>
    </root>
XML;
?> 

我想列出所有字段的内容。

这就是我所拥有的。它失败并在非对象上出现错误“member function xpath()”。

// load xml file
include 'xml/portfolio_xml.php';
$portfolio = simplexml_load_string($xml);

foreach ($portfolio->xpath('//project[@type="residential"]/item') as $item) {
    echo $item->description;
}

更新

实际上,此示例确实有效。显然,将样本从我的应用程序的其余部分中删除是我需要的。

1 个答案:

答案 0 :(得分:3)

您需要检查simple_xml_load_string是否成功。它现在失败了,因为$portfolio不是一个对象。

这部分是为什么我更喜欢使用真正的构造函数而不是函数。我更喜欢捕获异常并以这种方式处理错误:

try
{
  $portfolio = new SimpleXmlElement($xml);

  foreach ($portfolio->xpath('//project[@type="residential"]/item') as $item) {
    echo $item->description;
  }
}
catch(Exception $e)
{
  // do something.. or nothing on an error
}

这样,您不仅可以处理错误,还可以根据异常类型,代码,消息或上述所有内容采取特定操作。

此外,根据您可能想要的错误类型keep them internal to libxml