PHP получает данные из многоуровневого тега двоеточия XML-файла DOM PHP - PullRequest
1 голос
/ 26 июня 2019

У меня есть вопрос, как анализировать данные из XML-файла многоуровневого тега двоеточия с помощью PHP.Ниже приведены примеры данных в формате 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 ]

1 голос
/ 26 июня 2019

Не уверен, является ли 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>
0 голосов
/ 26 июня 2019

Вы можете получить узел передачи, используя следующий фрагмент кода

$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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...