2011-04-02 68 views
1

我想在没有遵循整个路径的情况下找到xml响应中的一部分。现在我知道了XPath具有搜索能力,但不知何故,我不明白它... :(simplexml和使用相对路径

我解析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>"; 
    } 

但是我不想用这个,因为我需要灵活的其他结果,不能依靠 searchUn。 dertakingResponse-> searchUndertakingResult

,所以我希望使用XPath到那里,但是这并不工作:

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

但我认为相对会工作,以及...任何想法?

+0

我认为这是对的preg_match和正则表达式或XML解析器的工作,但我不擅长这个。希望其他人会发布一段代码。 – Wh1T3h4Ck5 2011-04-02 07:11:47

回答

2

你会发现,你的<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"; 
} 
+0

这实际上甚至整洁的编码...感谢那...代码相应地调整.... – renevdkooi 2011-04-02 08:45:56

1

你可以尝试改变他们的方式循环?

while(list(, $node) = each($lijst)) { 
    echo 'kenmerk: ',$node,"\n"; 
} 
+0

nope,仍然没有... – renevdkooi 2011-04-02 07:35:48

+0

我认为这是因为不同的命名空间。尝试用'http:// www.rechtspraak.nl/namespaces/inspubber01'命名空间 – ysrb 2011-04-02 07:43:16

+0

选择节点我该怎么做? – renevdkooi 2011-04-02 07:45:57