【发布时间】:2010-12-16 06:47:18
【问题描述】:
我得到了以下格式的 XML,并用 PHP 的 SimpleXML 解析它。
<?xml version="1.0" encoding="UTF-8"?>
<ManageMyBooking>
<BookingInfo>
<PartyDetails>
<Passenger>
<PaxNo>1</PaxNo>
<Title>Mrs</Title>
<Surname>Murphy</Surname>
</Passenger>
<Passenger>
<PaxNo>2</PaxNo>
<Title>Mr</Title>
<Surname>Murphy</Surname>
</Passenger>
<Passenger>
<PaxNo>3</PaxNo>
<Title>Miss</Title>
<Surname>Murphy</Surname>
</Passenger>
</PartyDetails>
<Accommodation>
<Units>
<Unit>
<UnitNo>1</UnitNo>
<UnitDesc>...</UnitDesc>
<PaxAssociated>1|2</PaxAssociated>
</Unit>
<Unit>
<UnitNo>2</UnitNo>
<UnitDesc>...</UnitDesc>
<PaxAssociated>3</PaxAssociated>
</Unit>
</Units>
</Accommodation>
</BookingInfo>
</ManageMyBooking>
因此,我正在遍历单元(房间):
// $Accommodation is a SimpleXML Object defined earlier, and able to provide relevant info
<? foreach ($Accommodation->Units as $Units) {
foreach ($Units->Unit as $Unit) {
// (room/unit details echoed out here)
foreach ($Unit->xpath('//Passenger[contains(PaxAssociated,./PaxNo)]') as $RoomPax) { ?>
<?= $RoomPax->Title $RoomPax->Surname" ?><br />
<?= "$RoomPax->Title $RoomPax->Surname" ?><br />
<? }
}
} ?>
试图在每个房间里显示乘客 (Pax) 的名字。
但是这个 xpath 没有找到任何人,下面会得到每个人。
//Passenger[contains(PaxNo,./PaxAssociated)]
特别令人沮丧的是,我已经成功地在同一个 PHP 中的其他地方使用了 XPath,用于非常相似的目的,没有任何问题。
任何帮助/建议/建议将不胜感激。
编辑: 为了完整性,并回答多个人的问题: 以下代码在代码的其他地方有效(尽管考虑到“22”与“2”的可能匹配,但并非 100% 正确。
//Flight[contains(PaxAssociated,./PaxNo)]
【问题讨论】:
-
我很困惑
元素上的 xpath 如何完全返回 '//passenger' 的任何结果,因为在您的示例 xml 结构中,单元不包含乘客。你能发布 $accomodation 对象是如何定义的吗? -
看来是SimpleXML对象的一个内置特性,Unit元素是直接创建一个包含整棵树的SimpleXML对象。
-
有趣的功能 - 很高兴知道这一点,谢谢!
-
@jezmck:不,不是这样。请参阅下面的评论。 ;-)
标签: php xml xpath simplexml contains