[英]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";
}
输出:
//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.