PHP SimpleXML:如何访问嵌套的命名空间?

PHP SimpleXML: How to access nested namespaces?

鉴于此 XML 结构:

$xml = '<rss xmlns:media="http://search.yahoo.com/mrss/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0">
            <channel>
                <item>
                    <title>Title</title>
                    <media:group>
                        <media:content url="url1" />
                        <media:content url="url2" />
                    </media:group>
                </item>
                <item>
                    <title>Title2</title>
                    <media:group>
                        <media:content url="url1" />
                        <media:content url="url2" />
                    </media:group>
                </item>
            </channel>
        </rss>';
$xml_data = new SimpleXMLElement($xml);

如何访问 media:content 节点的属性?我试过了

foreach ($xml_data->channel->item as $key => $data) {
    $urls = $data->children('media', true)->children('media', true);
    print_r($urls);
}

foreach ($xml_data->channel->item as $key => $data) {
    $ns = $xml->getNamespaces(true);
    $urls = $data->children('media', true)->children($ns['media']);
    print_r($urls);
}

根据其他答案,但它们都return空简单XML元素。

当你用 SimpleXML 回显 XML 时,你需要使用 asXML() 才能看到真正的内容,print_r() 有自己的版本,没有显示全部内容...

foreach ($xml_data->channel->item as $key => $data) {
    $urls = $data->children('media', true)->children('media', true);
    echo $urls->asXML().PHP_EOL;
}

回声...

<media:content url="url1"/>
<media:content url="url1"/>

它只输出每个组的第一个,因为您需要添加另一个 foreach 来遍历每个元素的所有子节点。

foreach ($xml_data->channel->item as $key => $data) {
    echo $data->title.PHP_EOL;
    foreach ( $data->children('media', true)->children('media', true) as $content )   {
        echo $content->asXML().PHP_EOL;
    }
}

输出..

Title
<media:content url="url1"/>
<media:content url="url2"/>
Title2
<media:content url="url1"/>
<media:content url="url2"/>

要访问特定属性(例如第二个代码示例中的 url 属性),您必须使用 attributes() 方法...

echo $content->attributes()['url'];