无法获取 XML 的命名空间属性
Can't get out namespace attributes of XML
正在尝试从 <af:location>value</af:location>
中获取值。首先;是的,我搜索了 很多 来寻找如何做的答案。在 Whosebug 上阅读了很多问题,并尝试了很多代码。但就是无法正常工作。
我无法显示我所做的所有尝试,因为我不记得我尝试过的所有事情。
这是我使用的代码的精简版:
$xml_dump = Feed::curl_file_get_contents($url);
libxml_use_internal_errors(true);
if ($xml = simplexml_load_string($xml_dump))
{
}
例如我试过:
- 命名空间参数
'af'
在->simplexml_load_string($xml_dump, null, 0, 'af', true)
$xml->getNamespaces(true)
$sxe = new SimpleXMLElement($xml_dump); $namespaces = $sxe->getNamespaces(true);
但其中 none 个有效。
$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];
问题没说清楚,不得不说。您在问题开头提到过从带有前缀的元素中获取值。但是似乎在每次尝试的代码中都尝试获取名称空间。
"Trying to get out the value from <af:location>value</af:location>
"
如果你想从上面提到的元素中获取值,那么这是一种可能的方法:
$location = $xml->xpath('//af:location')[0];
echo $location;
输出:
1/160
如果您打算通过前缀名称获取命名空间 URI,那么使用 getNamespaces()
是可行的方法:
echo $xml->getNamespaces(true)['af'];
输出:
http://www.example.se/rss
我们确实需要一个像样的规范答案,但我将在这里再次重复,因为您搜索过但没有找到。答案真的很简单:你用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;
正在尝试从 <af:location>value</af:location>
中获取值。首先;是的,我搜索了 很多 来寻找如何做的答案。在 Whosebug 上阅读了很多问题,并尝试了很多代码。但就是无法正常工作。
我无法显示我所做的所有尝试,因为我不记得我尝试过的所有事情。
这是我使用的代码的精简版:
$xml_dump = Feed::curl_file_get_contents($url);
libxml_use_internal_errors(true);
if ($xml = simplexml_load_string($xml_dump))
{
}
例如我试过:
- 命名空间参数
'af'
在->simplexml_load_string($xml_dump, null, 0, 'af', true)
$xml->getNamespaces(true)
$sxe = new SimpleXMLElement($xml_dump); $namespaces = $sxe->getNamespaces(true);
但其中 none 个有效。
$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];
问题没说清楚,不得不说。您在问题开头提到过从带有前缀的元素中获取值。但是似乎在每次尝试的代码中都尝试获取名称空间。
"Trying to get out the value from
<af:location>value</af:location>
"
如果你想从上面提到的元素中获取值,那么这是一种可能的方法:
$location = $xml->xpath('//af:location')[0];
echo $location;
输出:
1/160
如果您打算通过前缀名称获取命名空间 URI,那么使用 getNamespaces()
是可行的方法:
echo $xml->getNamespaces(true)['af'];
输出:
http://www.example.se/rss
我们确实需要一个像样的规范答案,但我将在这里再次重复,因为您搜索过但没有找到。答案真的很简单:你用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;