Php 从Xpath获取值
下面是我的带有名称空间的xmlPhp 从Xpath获取值,php,xml,xpath,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
<?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>
在$xd_的foreach中,项不起作用。我的意思是第二个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
正如@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
的类型可以从中访问其房间属性,例如:
$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()
);
}
}
}
$xd\u物品->房间->房间
这将返回一个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()
);
}
}
}
$xd=simplexml_load_文件('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)作为$xd_项)
{
foreach($xd_项目->房间->房间作为$room){
foreach($room->rates->rates as$rate){
埃科斯普林特(
“id:%s
成人:%s
儿童:%s
”,
$rate->attributes()->id->\uuuuToString(),
$rate->attributes()->成人->\uu toString(),
$rate->attributes()->child->
);
}
}
}
变量$xd_item
的类型可以从中访问其房间属性,例如:
$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()
);
}
}
}
$xd\u物品->房间->房间
这将返回一个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()
);
}
}
}
$xd=simplexml_load_文件('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)作为$xd_项)
{
foreach($xd_项目->房间->房间作为$room){
foreach($room->rates->rates as$rate){
埃科斯普林特(
“id:%s
成人:%s
儿童:%s
”,
$rate->attributes()->id->\uuuuToString(),
$rate->attributes()->成人->\uu toString(),
$rate->attributes()->child->
);
}
}
}
不确定您认为echo'rate-C'
将如何获得“rate节点的值”,但请注意房间
,房间
,费率
和费率
都应该以n:
作为前缀,因为它们也是默认的http://www.test.com/schemas/messages
namespace.谢谢,我如何加入速率一些东西,比如echo$xd_rate->attributes()->id
我建议您改为使用DomDocument:,因为使用itthanks解析xml更容易,可以在domNo中编写类似于$xd->xpath(“rates/rate[@id='1'])
的条件,您必须在DomDocument中循环节点并检查其属性,您可以在这里使用DomXpath来代替第一个答案:不确定您认为echo'rate-C'
将如何获得“ratenode的值”,但请注意rooms
,rooms
,rates
,和rate
都应该以n:
作为前缀,因为它们也是默认的http://www.test.com/schemas/messages
namespace.Thank,我是如何加入速率的一些东西,比如echo$xd\u rate->attributes()->id
我建议您改用DomDocument:,由于使用iThanks解析xml更容易,因此可以在DomDocument中的domNo中编写条件,如$xd->xpath(“rates/rate[@id='1'])
,您必须在节点上循环并检查其属性,您可以改为使用DOMPATH查看第一个答案: