Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/xml/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 从Xpath获取值_Php_Xml_Xpath - Fatal编程技术网

Php 从Xpath获取值

Php 从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

    <?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查看第一个答案: