从Xpath获取值

时间:2016-01-31 04:47:15

标签: php xml xpath

下面是我的带命名空间的xml

    <?xml version="1.0" encoding="UTF-8"?>
    <hotels xmlns="http://www.test.com/schemas/messages" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" schemaLocation="http://www.test.com/schemas/messages">
    <hotel >
        <rooms>
            <room>
                <rates>
                    <rate id="1" adults="1" child="0"></rate>
                    <rate id="2" adults="2" child="0"></rate>
                    <rate id="3" adults="1" child="0"></rate>
                </rates>
            </room>
            <room>
                <rates>
                    <rate id="4" adults="1" child="0"></rate>
                    <rate id="5" adults="2" child="0"></rate>
                    <rate id="6" adults="2" child="0"></rate>
                </rates>
            </room>
        </rooms>
    </hotel>
    </hotels>

我使用foreach尝试下面的PHP代码(xpath)来获取ratenode的值

$xd = simplexml_load_file('C:/inetpub/vhosts/test.com/data_download/q.xml');
    $xd->registerXPathNamespace("n", "http://www.test.com/schemas/messages");       

foreach($xd->xpath("//n:hotels/n:hotel") as $xd_item)
        {
            echo 'item - A';
            foreach($xd_item->xpath("rooms/room") as $xd_room)
            {
                foreach($xd_room->xpath("rates/rate") as $xd_rate)
                {
                    echo 'rate - C';
                }
            }
        }

在$ xd_item的foreach中无效。我的意思是第二个foreach结束了值"echo 'item - A';"任何人都可以帮助我吗?

2 个答案:

答案 0 :(得分:0)

正如@kjhughes在他的评论中所提到的,代码的问题是某些元素在默认命名空间中,但是你的XPath错过了在这些元素上使用相应的前缀。此外,您的代码打印静态文字字符串,即'item - A''rate - C',而不是正在解析的XML的任何部分。

  

“可以在dom中写出像$xd->xpath("rates/rate[@id='1']")这样的条件

是的,这是可能的。也可以使用SimpleXML,例如:

$xd->registerXPathNamespace("n", "http://www.test.com/schemas/messages");
foreach($xd->xpath("//n:rate[@id='1']") as $rate){
    echo $rate["id"] .", ". $rate["adults"] .", ". $rate["child"] ."\r\n";
}

<强> eval.in demo

输出

//id, adults, rate
1, 1, 0

答案 1 :(得分:0)

变量The imported module "some module in .pyx" can not be found 的类型为SimpleXMLElement,您可以从中访问其房间属性,例如:

$xd_item

这将返回SimpleXMLElement类型的对象,您可以从中获取费率,并且可以使用$xd_item->rooms->room循环。您希望从&#39;率&#39;中获得的值在attributes

例如:

foreach