2020-01-07 php
こういうSoapなXML(?)をパースする場合、children メソッドを使って名前空間を明示的に指定することでパースできる。以下例。
<?php $input = '<?xml version="1.0" encoding="UTF-8"?> <ns1:Env xmlns:ns1="http://dummy/ns1/" xmlns:ns2="http://dummy/ns2/" xmlns:ns3="http://dummy/ns3/"> <ns1:Tag1> <ns2:Tag2> <ns3:Tag3> <ns3:Data1>データ1</ns3:Data1> <ns3:Data2>データ2</ns3:Data2> <ns3:Params> <ns3:p1>パラメータ1</ns3:p1> <ns3:p2>パラメータ2</ns3:p2> </ns3:Params> </ns3:Tag3> </ns2:Tag2> </ns1:Tag1> </ns1:Env>'; // エラー抑制 libxml_use_internal_errors(true); $xml = simplexml_load_string($input); $xmlErrors = libxml_get_errors(); libxml_clear_errors(); if (count($xmlErrors) > 0) { var_export($xmlErrors); exit; } // ns3:Tag3 にアクセス $ns3 = $xml ->children("ns1", true)->Tag1 ->children("ns2", true)->Tag2 ->children("ns3", true)->Tag3; // 値を取り出す var_dump( (string)$ns3->Data1, (string)$ns3->Data2, (string)$ns3->Params->p1, (string)$ns3->Params->p2 ); // string(10) "データ1" // string(10) "データ2" // string(16) "パラメータ1" // string(16) "パラメータ2"