0

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;

    }
4

3 に答える 3

0

これを見てください。

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

PHPマニュアルから:

次のXPathクエリのprefix/nsコンテキストを作成します。特に、これは、指定されたXMLドキュメントのプロバイダーが名前空間プレフィックスを変更する場合に役立ちます。registerXPathNamespaceは、関連付けられた名前空間のプレフィックスを作成し、プロバイダーによって指定された新しいプレフィックスを許可するようにコードを変更することなく、その名前空間のノードにアクセスできるようにします。

于 2013-03-25T16:33:32.790 に答える
0

これは以前に何度も尋ねられました。これらは「コロン付きのタグ」ではなく、XML名前空間であり、パーサーで特別な処理を行う必要があります。

SimpleXMLの場合、これは->children()and->attributes()メソッドによって提供されます。

エイリアス/プレフィックスが変更されないことを信頼して(XMLドキュメントの「セマンティクス」は変更されないため、これが保証されるわけではありません)true、2番目のパラメーターとして使用する$body->children('v12', TRUE)か(この場合)、名前空間の定数を設定できます。 URI(変更されないことが保証されています)とそれを渡します(あなたの場合define('XMLNS_FEDEX_V12', 'http://fedex.com/ws/ship/v12'); /* ... */ $body->children(XMLNS_FEDEX_V12))。

于 2013-03-28T19:19:54.990 に答える
-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;


        }
于 2013-03-25T16:46:32.067 に答える