Анализ ответа ASMX с помощью PHP и SimpleXML

0

Я запрашиваю сервис ASMX для значения. Служба возвращает следующий объект XML:

<?xml version="1.0" encoding="utf-8"?>
<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
    <soap:Body>
        <PerformSupportRequestResponse xmlns="http://www.example.com/API">
            <PerformSupportRequestResult>
                <Table>
                    <xs:schema id="NewDataSet" xmlns="" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
                        <xs:element name="NewDataSet" msdata:IsDataSet="true" msdata:MainDataTable="Results" msdata:UseCurrentLocale="true">
                            <xs:complexType>
                                <xs:choice minOccurs="0" maxOccurs="unbounded">
                                    <xs:element name="Results">
                                        <xs:complexType>
                                            <xs:sequence>
                                                <xs:element name="TotalUsers" type="xs:long" minOccurs="0" />
                                            </xs:sequence>
                                        </xs:complexType>
                                    </xs:element>
                                </xs:choice>
                            </xs:complexType>
                        </xs:element>
                    </xs:schema>
                    <diffgr:diffgram xmlns:msdata="urn:schemas-microsoft-com:xml-msdata" xmlns:diffgr="urn:schemas-microsoft-com:xml-diffgram-v1">
                        <DocumentElement xmlns="">
                            <Results diffgr:id="Results1" msdata:rowOrder="0">
                                <TotalUsers>2494</TotalUsers>
                            </Results>
                        </DocumentElement>
                    </diffgr:diffgram>
                </Table>
            </PerformSupportRequestResult>
        </PerformSupportRequestResponse>
    </soap:Body>
</soap:Envelope>

Я пробовал работать с этим с помощью SimpleXML и даже флиртовал с DOMDocument. Я должен поверить, что есть простой способ загрузить значения, которые будут возвращены между <Results> и </Results> в массив, но до сих пор единственным надежным методом было удаление любой строки, содержащей пространство имен, или Я хочу получить результат. Я не думаю, что это практично, потому что я должен сделать несколько вызовов этой службы с разными запросами, и ответы не всегда будут одинаковыми, но они всегда будут в узле Результаты ответа.

Я также попытался найти путь к ответам, используя что-то вроде:

$media = $xml->children('http://schemas.xmlsoap.org/soap/envelope/')->Body->PerformSupportRequestResponse->PerformSupportRequestResult->Table->children('urn:schemas-microsoft-com:xml-diffgram-v1')->diffgr->DocumentElement->Results

и пришли с пустыми руками. Есть ли простой способ извлечения членов узла Results, не прибегая к повторной записи всего объекта XML?

Теги:
web-services

1 ответ

0
Лучший ответ

Простой способ - с DOMXPath.


Пример:

$dom = new DOMDocument();
$dom->loadXML($xml);
$xpath = new DOMXPath($dom);

foreach ($xpath->query('//Results/*') as $result) {
    echo "$result->nodeName: $result->nodeValue";
}

Вывод:

TotalUsers: 2494
  • 0
    Или даже проще (но в основном то же самое) с методом SimpleXML $elememt->xpath() (сохраняет шаблон создания объекта DOMXPath ).

Ещё вопросы

Сообщество Overcoder
Наверх
Меню