PHP xPath парсинг SOAP - PullRequest
       38

PHP xPath парсинг SOAP

0 голосов
/ 08 мая 2018

PHP xPath, SOAP

У меня есть SOAP-запрос, тело которого похоже на приведенный ниже код. (Я удалил нерелевантные узлы). Я только хочу проанализировать запрос для узлов NumInfo, которые имеют NumType HI. Мне нужно получить значения Type, Num, Desc, Quantity и PriceInfo для узлов, имеющих узел NumInfo с NumType = HI.

Использование 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>

1 Ответ

0 голосов
/ 08 мая 2018

Вы должны быть в состоянии получить данные, используя ...

$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, это позволяет смешивать пространства имен и элементы. У вас может быть тот же именованный элемент, но другое пространство имен, так что это гарантирует, что вы ссылаетесь на правильный.

...