繁体   English   中英

从Xpath获取值

[英]get values from 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>

我尝试下面的PHP代码(xpath)使用foreach获取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中不起作用。 我的意思是第二个代表它的结尾,其值为"echo 'item - A';" 有人可以帮助我吗?

正如@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

变量$xd_item的类型为SimpleXMLElement ,您可以从中访问其房间属性,例如:

$xd_item->rooms->room

这将返回SimpleXMLElement类型的对象,您可以从中获取费率,并可以使用foreach进行循环。 您需要从“比率”中获得的值在属性中

例如:

$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)
{
    foreach($xd_item->rooms->room as $room) {
        foreach ($room->rates->rate as $rate) {
            echo sprintf(
                'id: %s<br>adults: %s<br>child: %s<br><br>',
                $rate->attributes()->id->__toString(),
                $rate->attributes()->adults->__toString(),
                $rate->attributes()->child->__toString()
            );
        }
    }
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM