无法获取XML的命名空间属性

时间:2016-02-25 11:13:04

标签: php xml namespaces simplexml

试图从<af:location>value</af:location>中获取值。首先;是的,我已经搜索很多以获取有关如何做的答案。在Stackoverflow上阅读了很多问题并尝试了很多代码。但是无法让它发挥作用。

我无法展示我所做的所有尝试,因为我不记得我尝试过的所有事情。

以下是我正在使用的代码的剥离版本:

$xml_dump = Feed::curl_file_get_contents($url);

libxml_use_internal_errors(true);

    if ($xml = simplexml_load_string($xml_dump))
    {

    }

我试过:

  • - &gt;中的命名空间参数'af' simplexml_load_string($xml_dump, null, 0, 'af', true)
  • $xml->getNamespaces(true)
  • $sxe = new SimpleXMLElement($xml_dump); $namespaces = $sxe->getNamespaces(true);

但它们都不起作用。

$xml_dump包含:

<?xml version="1.0"?>
<rss version="2.0" xmlns:af="http://www.example.se/rss">
    <channel>
        <title>RSS Title - Example.se</title>
        <link>http://www.example.se</link>
        <description>A description of the site</description>
        <pubDate>Wed, 24 Feb 2016 12:20:03 +0100</pubDate>


                <item>
                     <title>The title</title>
                     <link>http://www.example.se/2.1799db44et3a9800024.html?id=233068</link>
                     <description>A lot of text. A lot of text. A lot of text.</description>
                     <guid isPermaLink="false">example.se:item:233068</guid>

                     <pubDate>Wed, 24 Feb 2016 14:55:34 +0100</pubDate>
                     <af:profession>16/5311/5716</af:profession>
                     <af:location>1/160</af:location>

                </item>
  </channel>
</rss>

解决!

答案是:

$loc = $item->xpath('af:location');
echo $loc[0];

2 个答案:

答案 0 :(得分:1)

我不得不说,问题不明确。您提到过从问题开头的前缀元素中获取值。但似乎试图在每个尝试的代码中获取命名空间。

  

&#34;试图从<af:location>value</af:location>&#34;

中获取价值

如果你想从上面提到的元素中获取值,那么这是一种可能的方法:

$location = $xml->xpath('//af:location')[0];
echo $location;

输出

1/160

如果您的意思是通过前缀名称获取名称空间URI,那么使用getNamespaces()是可行的方法:

echo $xml->getNamespaces(true)['af'];

输出

http://www.example.se/rss

答案 1 :(得分:0)

我们真的需要一个体面的规范答案,但我会在这里重复一遍,因为你搜索并没有找到。答案非常简单:您使用the children() method

这将获取永久标识命名空间的URI(推荐)或您正在解析的特定文档中使用的前缀(如果文件是自动生成的,则可能会更改)。

在您的示例中,我们有CreatureBuilder,因此我们可以将该URI保存到常量,以使用对我们有意义的内容来标识命名空间:

ProjectA

然后在解析XML时,以正常方式遍历xmlns:af="http://www.example.se/rss"元素:

define('XMLNS_RSSAF', 'http://www.example.se/rss');

通过指定命名空间,您可以访问item的命名空间子项:

$xml = simplexml_load_string($xml_dump);
foreach ( $xml->channel->item as $item ) {
    // ...
}