Не уверен, является ли 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>