【问题标题】:Can't get out namespace attributes of XML无法取出 XML 的命名空间属性
【发布时间】:2016-02-25 11:13:04
【问题描述】:

试图从<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))
    {

    }

例如我已经尝试过:

  • 命名空间参数'af' in -> 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];

【问题讨论】:

标签: php xml namespaces simplexml


【解决方案1】:

问题不清楚,我不得不说。您在问题开头提到了从带有前缀的元素中获取值。但似乎尝试在每个尝试的代码中获取一个命名空间。

“试图从&lt;af:location&gt;value&lt;/af:location&gt;中取出值”

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

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

输出:

1/160

如果您的意思是通过前缀名称获取命名空间 URI,那么使用 getNamespaces() 是要走的路:

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

输出:

http://www.example.se/rss

【讨论】:

  • 啊哈,那我误解了很多。现在学到了一些东西。然而,这是我想要的第一个例子。问题:数组,是整个提要中所有&lt;af:location&gt; 的数组。或者我可以从每个$item-&gt;xpath('//af:location') 中获取第一个 / [0] 吗?你明白我的意思吗?
  • 我认为您需要在开头添加一个点以使 XPath 相对于当前 $item : $item-&gt;xpath('.//af:location')。至于直接孩子,你也可以省略// 部分:$item-&gt;xpath('af:location')
【解决方案2】:

我们确实需要一个体面的规范答案,但我将在这里再次重复,因为您搜索并没有找到。答案真的很简单:你用the children() method

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

在您的示例中,我们有 xmlns:af="http://www.example.se/rss",因此我们可以将该 URI 保存到一个常量中,以识别对我们有意义的命名空间:

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

然后在解析XML的时候,按照正常的方式遍历到item元素:

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

您可以通过指定命名空间来访问 $item 的命名空间子代:

$location = (string) $item->children(XMLNS_RSSAF)->location;

【讨论】:

    猜你喜欢
    • 2012-05-27
    • 1970-01-01
    • 1970-01-01
    • 2021-12-14
    • 2019-07-03
    • 1970-01-01
    • 1970-01-01
    • 2018-10-19
    相关资源
    最近更新 更多