Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/xpath/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
PHP xPath解析SOAP_Php_Xpath_Soap_Simplexml - Fatal编程技术网

PHP xPath解析SOAP

PHP xPath解析SOAP,php,xpath,soap,simplexml,Php,Xpath,Soap,Simplexml,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",

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>

OE
04715SNAA90ZZ
你好
187-01436
HPT
187
平底锅
掩护
1.
328.42
328.42
OE
71570SNAA00
平底锅
防抱死制动系统
1.
49.80
49.80
OE
66100SNEA00ZZ
平底锅
面板
1.
355.83
355.83
OE
04655SNE305ZZ
爸爸
平底锅
1.
994.13
994.13

您应该能够使用

$selected = $xml->xpath("//bms:Selected[bms:NumInfo/bms:NumType='HI']")[0];
echo (string)$selected->children("bms",true)->Desc;
注意XPath函数末尾的
[0]
,正如您所说的,因为它返回匹配节点的列表。通常,您会在
foreach()
中使用它,但如果只有一个,则可以通过这种方式缩短它

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

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

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