PHP xPath 解析 SOAP

MB34

PHP xPath 解析 SOAP

我有一个 SOAP 请求,它的主体类似于下面的代码。(我已经删除了不相关的节点)。我只想解析对 NumType 为 HI 的 NumInfo 节点的请求。我需要获取具有 NumType = HI 的 NumInfo 节点的节点的 Type、Num、Desc、Quantity 和 PriceInfo 值。

使用 xpath 获取这样的节点:

$xml = simplexml_load_file('RequestExample.xml');
$xml->registerXPathNamespace("bms", "http://www.cieca.com/BMS");
$xml->xpath("//bms:Selected[contains(., 'HI')]")

将获得包含 HI 的选定节点。xpath返回一个 SimpleXML 对象数组,对吗?

如何获取与该 NumInfo 节点对应的父级的其他信息?另外,通过注册命名空间,我不应该能够在我的 xpath 查询中省略它们吗?

<soap:Body>
    <bms:ProcurementAddRq>
        <bms:ProcurementFolder>
            <bms:ProcurementInfo>
                <bms:ProcurementList>
                    <bms:Procurement>
                        <bms:Selected>
                            <bms:NumInfo>
                                <bms:NumType>OE</bms:NumType>
                                <bms:Num>04715SNAA90ZZ</bms:Num>
                            </bms:NumInfo>
                            <bms:NumInfo>
                                <bms:NumType>HI</bms:NumType>
                                <bms:Num>187-01436</bms:Num>
                            </bms:NumInfo>
                            <bms:NumInfo>
                                <bms:NumType>HPT</bms:NumType>
                                <bms:Num>187</bms:Num>
                            </bms:NumInfo>
                            <bms:Type>PAN</bms:Type>
                            <bms:Desc>Cover</bms:Desc>
                            <bms:Quantity>1</bms:Quantity>
                            <bms:PriceInfo>
                                <bms:UnitListPrice>328.42</bms:UnitListPrice>
                                <bms:UnitNetPrice>328.42</bms:UnitNetPrice>
                            </bms:PriceInfo>
                        </bms:Selected>
                    </bms:Procurement>
                    <bms:Procurement>
                        <bms:Selected>
                            <bms:NumInfo>
                                <bms:NumType>OE</bms:NumType>
                                <bms:Num>71570SNAA00</bms:Num>
                            </bms:NumInfo>
                            <bms:Type>PAN</bms:Type>
                            <bms:Desc>Abs</bms:Desc>
                            <bms:Quantity>1</bms:Quantity>
                            <bms:PriceInfo>
                                <bms:UnitListPrice>49.80</bms:UnitListPrice>
                                <bms:UnitNetPrice>49.80</bms:UnitNetPrice>
                            </bms:PriceInfo>
                        </bms:Selected>
                    </bms:Procurement>
                    <bms:Procurement>
                        <bms:Selected>
                            <bms:NumInfo>
                                <bms:NumType>OE</bms:NumType>
                                <bms:Num>66100SNEA00ZZ</bms:Num>
                            </bms:NumInfo>
                            <bms:Type>PAN</bms:Type>
                            <bms:Desc>Panel</bms:Desc>
                            <bms:Quantity>1</bms:Quantity>
                            <bms:PriceInfo>
                                <bms:UnitListPrice>355.83</bms:UnitListPrice>
                                <bms:UnitNetPrice>355.83</bms:UnitNetPrice>
                            </bms:PriceInfo>
                        </bms:Selected>
                    <bms:Procurement>
                        <bms:Selected>
                            <bms:NumInfo>
                                <bms:NumType>OE</bms:NumType>
                                <bms:Num>04655SNE305ZZ</bms:Num>
                            </bms:NumInfo>
                            <bms:Type>PAP</bms:Type>
                            <bms:Desc>Pan</bms:Desc>
                            <bms:Quantity>1</bms:Quantity>
                            <bms:PriceInfo>
                                <bms:UnitListPrice>994.13</bms:UnitListPrice>
                                <bms:UnitNetPrice>994.13</bms:UnitNetPrice>
                            </bms:PriceInfo>
                        </bms:Selected>
                </bms:ProcurementList>
            </bms:ProcurementInfo>
        </bms:ProcurementFolder>
    </bms:ProcurementAddRq>
</soap:Body>
Nigel Ren

您应该能够使用...获取数据

$selected = $xml->xpath("//bms:Selected[bms:NumInfo/bms:NumType='HI']")[0];
echo (string)$selected->children("bms",true)->Desc;

请注意[0]XPath 函数的末尾,正如您所说,因为它返回匹配节点的列表。通常你会在 a 中使用它,foreach()但如果只有一个,那么你可以通过这种方式缩短它。

当您获取一个节点时,这实际上是一个 SimpleXMLElement,使用(string)将值强制转换为字符串,让您可以更灵活地将其用作值(echo无论如何都这样做,但这只是为了说明原理)

->children("bms",true)位返回命名空间中的所有子节点(使用前缀),这允许您在->Desc没有前缀的情况下使用

即使你注册了命名空间,你仍然需要在你的 XPath 语句中使用它,这允许你混合命名空间和元素。您可能具有相同的命名元素但具有不同的命名空间,因此这可以确保您引用正确的元素。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章