simplexml и используя относительный путь - PullRequest
1 голос
/ 02 апреля 2011

Я пытаюсь добраться до части в ответе xml, не следуя всему пути. Теперь я знаю, что у xpath есть возможности поиска, но почему-то я этого не понимаю ...: (

XML, который я анализирую, таков:

<?xml version="1.0" encoding="utf-8"?>
<soapEnvelope xmlns:soap="http://www.w3.org/2003/05/soap-envelope" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:wsa="http://schemas.xmlsoap.org/ws/2004/08/addressing" xmlns:wsse="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd" xmlns:wsu="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd">
    <envHeader xmlns:env="http://www.w3.org/2003/05/soap-envelope">
        <wsaAction>http://www.rechtspraak.nl/namespaces/cir01/searchUndertakingResponse</wsaAction>
        <wsaMessageID>urn:uuid:11f7d4cd-2280-4298-85eb-dadf5bd743f1</wsaMessageID>
        <wsaRelatesTo>urn:uuid:59630fbd-b990-4020-9c1c-822c58186d96</wsaRelatesTo>
        <wsaTo>http://schemas.xmlsoap.org/ws/2004/08/addressing/role/anonymous</wsaTo>
        <wsseSecurity>
            <wsuTimestamp wsu:Id="Timestamp-df25f141-fed2-47ed-967e-93cd04d1c8f2">
                <wsuCreated>2011-04-02T06:52:52Z</wsuCreated>
                <wsuExpires>2011-04-02T06:57:52Z</wsuExpires>
            </wsuTimestamp>
        </wsseSecurity>
    </envHeader>
    <soapBody>
        <searchUndertakingResponse xmlns="http://www.rechtspraak.nl/namespaces/cir01"><searchUndertakingResult>
                <publicatieLijst xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" extractiedatum="2011-04-02T08:52:51" xmlns="http://www.rechtspraak.nl/namespaces/inspubber01">
                    <publicatieKenmerk>sgr.10.787.F.1300.1.10</publicatieKenmerk>
                    <publicatieKenmerk>utr.10.585.F.1300.1.10</publicatieKenmerk>
                </publicatieLijst>
            </searchUndertakingResult>
        </searchUndertakingResponse>
    </soapBody>
</soapEnvelope>

И я ищу эти значения: <publicatieKenmerk>sgr.10.787.F.1300.1.10</publicatieKenmerk> <publicatieKenmerk>utr.10.585.F.1300.1.10</publicatieKenmerk>

Теперь это работает:

$lijst = $results->soapBody->searchUndertakingResponse->searchUndertakingResult->publicatieLijst->publicatieKenmerk;
    foreach ($lijst AS $kenmerk) {
        echo $kenmerk."<BR>";
    }

Но я не хочу использовать это, так как мне нужно быть гибким для других результатов. и не может полагаться на searchUndertakingResponse-> searchUndertakingResult

Так что я надеялся использовать xpath, но это не работает:

 $lijst = $results->xpath('//publicatieKenmerk');
    foreach($lijst as $kenmerk) {
        echo $kenmerk."<br />";
    }

Но я думал, что родственник тоже подойдет ... есть идеи?

Ответы [ 2 ]

2 голосов
/ 02 апреля 2011

Вы заметите, что ваш узел <publicatieLijst> имеет заданное по умолчанию пространство имен: xmlns="http://www.rechtspraak.nl/namespaces/inspubber01", что означает, что <publicatieKenmerk> существует это пространство имен.Вот почему //publicatieKenmerk не найдет его, вам придется искать в нужном пространстве имен.

Для этого вы можете зарегистрировать пространство имен со своим собственным префиксом и использовать этот префикс в следующем запросе XPath, например так::

$soapEnvelope = simplexml_load_string($xml);

$soapEnvelope->registerXPathNamespace(
    'inspubber01',
    'http://www.rechtspraak.nl/namespaces/inspubber01'
);

foreach ($soapEnvelope->xpath('//inspubber01:publicatieKenmerk') as $publicatieKenmerk)
{
    echo $publicatieKenmerk, "\n";
}
1 голос
/ 02 апреля 2011

Можете ли вы попытаться изменить то, как оно зацикливается?

...