首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >PHP解析SOAP

PHP解析SOAP
EN

Stack Overflow用户
提问于 2018-05-08 15:01:05
回答 1查看 127关注 0票数 0

PHP解析SOAP

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

使用xpath获取如下节点:

代码语言:javascript
复制
$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查询中省略它们吗?

代码语言:javascript
复制
<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>
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-05-08 15:19:28

你应该可以用.

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

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

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

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

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50236701

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档