gpt4 book ai didi

php - PHP SimpleXML XPath contains()查找此元素引用的其他元素

转载 作者:行者123 更新时间:2023-12-03 17:20:17 25 4
gpt4 key购买 nike

我得到以下格式的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 />
<? }
}
} ?>


试图向每个房间的乘客(乘客)显示姓名。

但是这个xpath找不到一个,下面的每个人都能找到。

//Passenger[contains(PaxNo,./PaxAssociated)]


尤其令人沮丧的是,我已经在同一PHP的其他地方成功使用了XPath,实现了非常相似的目的,没有任何问题。

任何帮助/建议/建议将不胜感激。



编辑:
为了完整性,并回答多个人的问题:
以下代码可以在代码中的其他地方工作(尽管考虑到“ 22”与“ 2”的可能匹配,但并非100%正确)。

//Flight[contains(PaxAssociated,./PaxNo)]

最佳答案

这个:

//Passenger[contains(PaxNo,./PaxAssociated)]


是:查找带有子 <Passenger>且其值包含子 <PaxNo>的值的任何 <PaxAssociated>。它仅适用于这样的数据结构(您显然没有):

<ManageMyBooking>
<BookingInfo>
<PartyDetails>
<Passenger>
<PaxNo>1|2</PaxNo> <!-- note the exchanged value! -->
<PaxAssociated>1</PaxAssociated>
</Passenger>
</PartyDetails>
</BookingInfo>
</ManageMyBooking>


因此,这在多个帐户上是错误的。您的意思可能是动态XPath表达式,如下所示:

foreach ($Units->Unit as $Unit) {
$XPath = "//Passenger[contains('". $Unit->PaxAssociated . "', PaxNo)]";
foreach ($Unit->xpath($XPath) as $RoomPax) {
// ...
}
}


乍一看,这是可行的,但它不是故障安全的,因为“ 22”也包含“ 2”。因此,单独执行 contains()并不能帮助您。正确的是:

$XPath = "//Passenger[contains('|". $Unit->PaxAssociated ."|', concat('|', PaxNo, '|'))]";


这样,您检查“ | 22 |”针对“ | 2 |”,它将返回false。

关于php - PHP SimpleXML XPath contains()查找此元素引用的其他元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1728947/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com