2013-03-25 4 views
0

SimpleXML xpath를 사용하여 태그 이름에 콜론이있는 태그를 구문 분석하는 간단한 방법이 있습니까?PHP에서 SimpleXML xpath를 사용하여 콜론으로 태그 분석

예 : 여기

<v12:ProcessShipmentResponse>SUCCESS</v12:ProcessShipmentResponse> 

내가 네임 스페이스하지만 네임 스페이스 태그가 중단되지 않는 태그를 구문 분석하는 데 사용하는 코드입니다.

$xml = simplexml_load_string($responseXMLL, NULL, NULL, 'http://schemas.xmlsoap.org/soap/envelope/'); 


    foreach ($xml->xpath('soapenv:Body') as $body) { 


     $custInfoArr['status'] = (string) $body->v12:ProcessShipmentReply->v12:HighestSeverity; 
     $custInfoArr['trackingCode'] = (string) $body->v12:ProcessShipmentReply->v12:CompletedShipmentDetail->v12:CompletedPackageDetails->v12:TrackingIds->v12:TrackingNumber; 
     $custInfoArr['labelCode'] = (string) $body->v12:ProcessShipmentReply->v12:CompletedShipmentDetail->v12:CompletedPackageDetails->v12:Label->v12:Parts->v12:Image; 

    } 

답변

0

this을 살펴보십시오. PHP 매뉴얼에서

public bool SimpleXMLElement::registerXPathNamespace(string $prefix,string $ns); 

:

다음 XPath 쿼리의 접두사/ns의 컨텍스트를 작성합니다. 특히 은 지정된 XML 문서의 공급자가 네임 스페이스 접두사를 변경하는 경우 유용합니다. registerXPathNamespace는 연결된 네임 스페이스 에 대한 접두사를 만들고 해당 네임 스페이스의 노드에 액세스 할 수있게하며 공급자가 지정하는 접두사를 허용하도록 코드를 변경하지 않아도됩니다.

+0

이것은 SimpleXML에서 제공하는 일반적인 객체 및 배열 스타일 액세스 ('-> node' 및'[ 'attribute']')가 아닌 XPath를 사용하는 경우에만 관련이 있습니다. – IMSoP

+0

@IMSoP : 대체 작업 솔루션입니다. 왜 당신이 다운 voted인지 모르겠군요. – DonCallisto

+0

네,하지만 실제로 사용 방법을 설명하지 않았기 때문에 OP 코드를 수정하는 방법처럼 보였습니다. OP 코드는 XPath를 사용하지 않고 한 번만 사용한 것이므로 필요하지 않습니다. – IMSoP

-1

이와 같은 네임 스페이스를 등록해야합니다. 누군가가 그것을 필요로 할 경우에 대비 한 작업 예제가 있습니다.

 $xml = simplexml_load_string($result, NULL, NULL, 'http://schemas.xmlsoap.org/soap/envelope/'); 
     $xml->registerXPathNamespace('env', 'http://schemas.xmlsoap.org/soap/envelope/'); 
     $xml->registerXPathNamespace('v12', 'http://fedex.com/ws/ship/v12'); 
     $bodies = $xml->xpath('env:Body'); 

     foreach($bodies as $body){ 

      $reply = $body->children('v12', TRUE)->ProcessShipmentReply; 
      $custInfoArr['status'] = (string) $reply->HighestSeverity; 
      $custInfoArr['trackingCode'] = (string) $reply->CompletedShipmentDetail->CompletedPackageDetails->TrackingIds->TrackingNumber; 
      $custInfoArr['labelCode'] = (string) $reply->CompletedShipmentDetail->CompletedPackageDetails->Label->Parts->Image; 


     } 
+1

'registerXPathNamespace'는'-> xpath()'를 사용하는 경우에만 필요합니다. '-> children()'메소드는 순수하게 XML 자체를 기반으로합니다. – IMSoP

0

이것은 여러 번 요청되었습니다. 이들은 "콜론 태그"가 아니며 XML 네임 스페이스이며 모든 파서에서 특별한 처리가 필요합니다.

SimpleXML의 경우 ->children()->attributes() 방법으로 제공됩니다.

변경하지 않고 별칭/접두어를 사용하거나 (XML 문서의 "의미"가 변경되지 않으므로 보장 할 수 없음) true을 두 번째 매개 변수 (사용자의 경우 $body->children('v12', TRUE))로 사용하거나 네임 스페이스 URI에 대한 상수를 설정하고 (변경하지 않을 것을 보장) 케이스를 define('XMLNS_FEDEX_V12', 'http://fedex.com/ws/ship/v12'); /* ... */ $body->children(XMLNS_FEDEX_V12)으로 전달합니다.

관련 문제