犬ターネット

SoapなXMLをPHPでparseする

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"

正月の日記

Windows PowerShell で tail