PHP:如何使用嵌套的xpath元素解析XML

时间:2013-01-21 17:35:58

标签: php parsing xpath simplexml

以下是我正在处理的XML:

<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:noo="http://www.myscheme.com/schema">
    <channel>
        <item>
            <title>A Simple Title</title>
            <noo:subcategory>the sub category</noo:subcategory>
            <noo:relatedInfos>
                <noo:teams>
                    <noo:team id="3">New York</noo:team>
                    <noo:team id="4">Las Vegas</noo:team>
                </noo:teams>
            </noo:relatedInfos>
        </item>
    </channel>
</rss>

我正在使用这个PHP代码来获取两个“团队”,但它不起作用($ xml具有以前的内容):

$xml_datas = simplexml_load_string($xml);

foreach($xml_datas->channel->item as $item){                      
    $noo = $item->children('noo');
    echo $noo->team;
}

你知道它为什么不起作用吗?

由于

2 个答案:

答案 0 :(得分:0)

看看这是否有帮助:

<?php // RAY_temp_userco.php
error_reporting(E_ALL);

$xml = <<<ENDXML
<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:noo="http://www.myscheme.com/schema">
    <channel>
        <item>
            <title>A Simple Title</title>
            <noo:subcategory>the sub category</noo:subcategory>
            <noo:relatedInfos>
                <noo:teams>
                    <noo:team id="3">New York</noo:team>
                    <noo:team id="4">Las Vegas</noo:team>
                </noo:teams>
            </noo:relatedInfos>
        </item>
    </channel>
</rss>
ENDXML;

$obj = simplexml_load_string($xml);

$ns = $obj->getNamespaces(TRUE);

foreach($obj->channel->item as $item){
    $noo = $item->children($ns['noo']);
    var_dump($noo);
}

答案 1 :(得分:0)

&#34; NOO&#34;只是该命名空间的本地别名,->children()方法(以及大多数XML处理函数)想知道它的实际全局标识符,即xmlns属性中的URI。

您需要指定命名空间的完整标识符(即->children('http://www.myscheme.com/schema'))或设置可选的第二个参数以告诉SimpleXML查找前缀(->children('noo', true)。第二个可能更具可读性,但是如果未来的文档具有相同的模式,它将会中断,但会为命名空间提供不同的本地别名。

此外,team节点不直接位于item节点下,因此您需要进一步遍历以获取它们:

// Give the namespace a readable name that won't change
define('NS_NOO', 'http://www.myscheme.com/schema');

$xml_datas = simplexml_load_string($xml);

foreach($xml_datas->channel->item as $item){                      
    $teams = $item->children(NS_NOO)->relatedInfo->teams;
    echo $teams->team[0];
}