我在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,我可以看到这样的不透明节点:
我也试过这个:
$supplementsNodes2 = $hotel->getElementsByTagName('boardbase');
但没有成功
答案 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');
}