PHP从多层标签冒号XML文件DOM PHP中获取数据

时间:2019-06-26 05:36:18

标签: php xml dom

我有一个问题,如何使用dom PHP从多级标记冒号XML文件中解析数据。 以下是我的XML示例数据。我想在内部获取数据并作为数组数据返回

<soapenv:Envelope xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
  <soapenv:Body>
    <HostCustomerResponse xmlns="http://xx.xx.xx.xx">
      <ns1:output xmlns:ns1="http://xx.xx.xx" xmlns:ns2="some:url" xsi:type="ns2:Output">
       <ns2:statusCode>00</ns2:statusCode>
       <ns2:statusMsg/>
       <ns2:txnResponseDateTime>20190625164236</ns2:txnResponseDateTime>
       <ns2:txnData>
         <transferRequest>
           <transfer>
             <transferId>123456789</transferId>
             <txnDate>123456789</txnDate>
             <debitAcctNo>123456789</debitAcctNo>
             <benAcctNo>123456789</benAcctNo>
          </transfer>
        </transferRequest>
      </ns2:txnData>
    </ns1:output>
   </HostCustomerResponse>
  </soapenv:Body>
</soapenv:Envelope>

我想要这个结果。

array(
  [transferID] => 123456789,
  [txnDate] => 123456789, 
  .....
)

2 个答案:

答案 0 :(得分:1)

不确定http://xx.xx.xx.xx是否是

中的真实名称空间
<HostCustomerResponse xmlns="http://xx.xx.xx.xx">

,但是因为这定义了任何默认元素(即后面的元素)的名称空间,所以您需要加载源XML,然后注册该名称空间。然后,您可以使用XPath查找<transfer>元素。然后,您只需遍历其中的元素(使用children()并将它们添加到输出数组中即可。

$xml = simplexml_load_string($source);
$xml->registerXPathNamespace("d", "http://xx.xx.xx.xx");
$transfer = $xml->xpath("//d:transfer")[0];
$output = [];
foreach ( $transfer->children() as $key=> $value )  {
    $output[$key] = (string)$value;
}

您的原始XML缺少soapenv命名空间的定义,因此我添加了该名称以使XML正确...

<soapenv:Envelope xmlns:soapenv="http://soapev.com" 
        xmlns:xsd="http://www.w3.org/2001/XMLSchema" 
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
  <soapenv:Body>
    <HostCustomerResponse xmlns="http://xx.xx.xx.xx">
      <ns1:output xmlns:ns1="http://xx.xx.xx" xmlns:ns2="some:url" xsi:type="ns2:Output">
       <ns2:statusCode>00</ns2:statusCode>
       <ns2:statusMsg/>
       <ns2:txnResponseDateTime>20190625164236</ns2:txnResponseDateTime>
       <ns2:txnData>
         <transferRequest>
           <transfer>
             <transferId>123456789</transferId>
             <txnDate>123456789</txnDate>
             <debitAcctNo>123456789</debitAcctNo>
             <benAcctNo>123456789</benAcctNo>
          </transfer>
        </transferRequest>
      </ns2:txnData>
    </ns1:output>
   </HostCustomerResponse>
  </soapenv:Body>
</soapenv:Envelope>

答案 1 :(得分:0)

您可以使用以下代码段获取传输节点

$response = preg_replace("/(<\/?)(\w+):([^>]*>)/", "$1$2$3", $soapXMLResult);
$xml      = new SimpleXMLElement($response);
$body     = $xml->xpath('//soapenvBody')[0];
$array    = json_decode(json_encode((array)$body), TRUE); 
$transfer = $array['HostCustomerResponse']['ns1output']['ns2txnData']['transferRequest']['transfer'];

https://3v4l.org/UKnZs