无法访问xml节点PHP

时间:2013-11-22 12:20:53

标签: php xml

我在php中有一个页面,我必须解析一个xml。 我这样做了:

$hotelNodes = $xml_data->getElementsByTagName('Hotel');
   foreach($hotelNodes as $hotel){
      $supplementsNodes2 = $hotel->getElementsByTagName('BoardBase');
      foreach($supplementsNodes2 as $suppl2) {
         echo'<p>HERE</p>'; //not enter here
      }
   }
}

在这段代码中,我访问了我的xml和foreach酒店的每个酒店,我想搜索标签BoardBase,但它不会进入其中。

这是我的xml(切割很多部分!!!!!

<hotel desc="DESC" name="Hotel">
   <selctedsupplements>
        <boardbases>
            <boardbase bbpublishprice="0" bbprice="0" bbname="Colazione Continentale" bbid="1"></boardbase>
        </boardbases>
    </selctedsupplements>
    </occupancy></occupancies>
</hotel>

我有很多节点没有BoardBase,但有时候却没有输入。 可能无法访问此节点吗?

此xml由具有SoapClient的服务器接收。

如果我检查在firebug中打印的XML,我可以看到这样的不透明节点:

enter image description here

我也试过这个:

$supplementsNodes2 = $hotel->getElementsByTagName('boardbase');

但没有成功

2 个答案:

答案 0 :(得分:3)

我可以从一开始就看到2个问题:XML名称​​区分大小写,因此:

$hotelNodes = $xml_data->getElementsByTagName('Hotel');

无法工作,因为您的xml节点如下所示:

<hotel desc="DESC" name="Hotel">

hotel =&gt;小写!
正如您所见here

  

[...]元素之类的名称,而XML明确区分大小写。

官方规范将标记名称指定为区分大小写,因此getElementsByTagName('FOO')不会返回与getElementsByTagName('foo')相同的元素...

其次,你似乎有一些标签汤:

</occupancy></occupancies>
<!-- tag names don't match, both are closing tags -->

这只是普通的无效标记,它应该是:

<occupancy></occupancy>

<occupancies></occupancies>

这将是前2个通话端口 我使用此代码设置了一个快速键盘,which you can see here

$xml = '<hotel desc="DESC" name="Hotel">
    <selctedsupplements>
        <boardbases>
            <boardbase bbpublishprice="0" bbprice="0" bbname="Colazione Continentale" bbid="1"></boardbase>
        </boardbases>
    </selctedsupplements>
    <occupancy></occupancy>
</hotel>';
$dom = new DOMDocument;
$dom->loadXML($xml);
$badList = $dom->getElementsByTagName('Hotel');
$correctList = $dom->getElementsByTagName('hotel');
echo sprintf("%d",$badList->lenght),
    ' compared to ',
    $correctList->length, PHP_EOL;

输出“0与1”相比,这意味着使用小写选择器返回1个元素,具有大写字母H的那个返回空列表。

要获取每个boardbase代码的hotel代码,您只需写下:

$hotels = $dom->getElementsByTagName('html');
foreach($hotels as $hotel)
{
    $supplementsNodes2 = $hotel->getElementsByTagName('boardbase');
    foreach($supplementsNodes2 as $node)
    {
        var_dump($node);//you _will_ get here now
    }
}

正如您所见on this updated codepad

答案 1 :(得分:2)

亚历山德罗,你的XML是一团糟(= un赌场),你真的需要直截了当。 Elias的回答指出了一些非常基本的问题。

我建立在Elias设置的代码板上,它与我完美配合:

$dom = new DOMDocument;
$dom->loadXML($xml);

$hotels = $dom->getElementsByTagName('hotel');
foreach ($hotels as $hotel) {
    $bbs = $hotel->getElementsByTagName('boardbase');
    foreach ($bbs as $bb) echo $bb->getAttribute('bbname');
}

请参阅http://codepad.org/I6oxkEOC