在保存到变量之前,PHP检查XML节点是否存在?

时间:2018-02-15 11:27:01

标签: php xml wordpress

以下是我正在使用的xml的片段:

My example xml

客户要求我们添加过滤哪​​种类型的"新闻文章"显示在特定页面上。他们在另一个网站上创建这些文章,他们现在可以在每个文章中分配一个或多个类别。我们通过php和xml加载文章。

我收到的错误是:

  

在...

中调用null成员函数getElementsByTagName()

以下是我正在使用的2012年代码:

            $item = $dom_object->getElementsByTagName("Releases");
            foreach( $item as $value )
             {
                 $Release = $value->getElementsByTagName("Release");
                 foreach($Release as $ind_Release){
                     $Title = $ind_Release->getElementsByTagName("Title");
                     $PublishDateUtc =  $ind_Release->getAttribute('PublishDateUtc');
                     $DetailUrl =  $ind_Release->getAttribute('DetailUrl');
                     $parts = explode('/', $DetailUrl);
                     $last = end($parts);

我正试图横向于类别代码,并使用:

设置变量
$newsCategory = $ind_Release->getElementsByTagName("Categories")->item(0)->getElementsByTagName("Category")->item(0)->getElementsByTagName("Code")->item(0)->nodeValue;          

这会加载当前2018篇文章,其中包含被回应的类别slug,因为它们有一个已分配的类别,但它无法加载2017年,2016年等等,我相信,因为它们未在XML中分配类别,这打破了一些东西。

A news article without a category appears with an empty categories node within XML

我知道我正在使用getElementsByTagName,并且因为第一个类别节点之外没有元素,所以它会中断。

在尝试将其设置为变量并打破它之前,是否有办法检查确实存在类别>类别>代码[CDATA]的路径?

如果这令人困惑,我道歉,我不是PHP专家,可以使用我能得到的所有帮助。是否有更好的方法来横向于所需的节点?

感谢。

1 个答案:

答案 0 :(得分:0)

您需要使用XPath。如果您使用的是DOMDocument,则可以通过DOMXpath完成。

您当前的方法使用链接,如果链接的特定关键点没有返回以下方法所依赖的内容,则链接问题会被破坏。因此你的错误。

相反,请从头开始检查整个路径:

$domxp = new DOMXpath($dom_object);
$node = $domxp->query('/Categories[1]/Category[1]/Code[1]');
if (count($node)) {
    //found - do something
}