代码之家  ›  专栏  ›  技术社区  ›  J. Doe

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

  •  2
  • J. Doe  · 技术社区  · 7 年前

    给定此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);
    

    如何访问媒体的属性:内容节点?我试过了

    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);
    }
    

    根据其他答案,但它们都返回空的simplexmlements。

    1 回复  |  直到 7 年前
        1
  •  0
  •   Nigel Ren    7 年前

    使用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'];