Я пытаюсь добраться до части в ответе 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>
<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 />"; }
Но я думал, что родственник тоже подойдет ... есть идеи?
Вы заметите, что ваш узел <publicatieLijst> имеет заданное по умолчанию пространство имен: xmlns="http://www.rechtspraak.nl/namespaces/inspubber01", что означает, что <publicatieKenmerk> существует это пространство имен.Вот почему //publicatieKenmerk не найдет его, вам придется искать в нужном пространстве имен.
<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"; }
Можете ли вы попытаться изменить то, как оно зацикливается?