simpleXML返回空元素

时间:2010-09-28 14:26:57

标签: php xml rss simplexml feeds

我在阅读XML-Feed时遇到了问题 XML文件的示例:

<f:feed xmlns:f="http://www.bbgo.de/feedxml/feed" xmlns:a="http://www.bbgo.de/feedxml/article" xmlns="http://www.w3.org/1999/xhtml" f:customer="blub" f:name="dax-tecdax">
<f:title>Analysen: DAX, TecDAX</f:title>
<f:date>2010-09-22T20:46:29+02:00</f:date>
<f:url>http://www.bbgo.de/export/feed/stock-channel/dax-tecdax</f:url>
<f:articles>
<a:article a:id="2310446" a:status="published" a:payed-content="false" xml:lang="de-DE">
<a:title>Kabel Deutschland mit Verkaufsempfehlung</a:title>...

一个简单的测试,如:

$feed = new SimpleXMLElement($xml);
print_r($feed);

生成

SimpleXMLElement Object ( )

如果我尝试

echo $xml;

以上样本正确回显。

为什么没有构建$ feed数组?如何访问<a:article>中的所有<f:articles>

2 个答案:

答案 0 :(得分:0)

  

如何访问<a:article>中的所有<f:articles>

对我来说,使用命名空间时simpleXML似乎有点笨拙(但话说再说一次,我不是PHP编码器)。您可以使用children方法,但在我看来,使用XPath更简单。

$feed->registerXPathNamespace('f', 'http://www.bbgo.de/feedxml/feed');
$feed->registerXPathNamespace('a', 'http://www.bbgo.de/feedxml/article');
$article = feed->xpath("/f:feed/f:articles/a:article");

首先,您需要使用一些前缀注册名称空间(前缀不需要与XML文档中使用的前缀相匹配,但名称空间URI必须匹配),然后在XPath表达式中使用这些前缀来选择目标。如果没有元素名称前缀,XPath表达式将查找不在任何名称空间中的元素。

  

为什么没有构建$ feed数组?

很难猜出这个原因。你可以测试的一些事情:

  • 是字符串$xml格式正确的xml文档
  • 使用显式字符串参数work $feed = new SimpleXMLElement('<root><child/></root>');
  • 创建SimpleXMLElement
  • 您可以使用simplexml_load_file($yourXMLfile);simplexml_load_string($yourXMLstring);
  • 加载文档吗?

答案 1 :(得分:0)

我遇到了类似的问题,结果证明该问题与CDATA有关。

所以最初我是用这个的:

j = &i;

然后我得到了像op一样的空描述对象:

$feed = simplexml_load_file($rss_url);

但是后来我在PHP.net网站的注释中找到了这个解决方案,说我需要使用LIBXML_NOCDATA标志:https://www.php.net/manual/en/function.simplexml-load-file.php

[description] => SimpleXMLElement Object
   (
   )

进行此更改后,我得到了这样的描述:

$feed = simplexml_load_file($rss_url, "SimpleXMLElement", LIBXML_NOCDATA);

虽然不确定如何直接将LIBXML_NOCDATA应用于SimpleXMLElement。