У меня есть набор данных XML, который я использую через SOAP через PHP. Я пытаюсь разобрать значения из XML, чтобы я мог использовать эти значения для заполнения в базе данных. Я долго искал, чтобы найти лучший способ сделать это. Вот пример некоторого xml:
<?xml version="1.0" encoding="utf-8"?>
<soap:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
<soap:Body>
<PaymentNotification xmlns="http://apilistener.envoyservices.com">
<payment>
<uniqueReference>ESDEUR11039872</uniqueReference>
<epacsReference>74348dc0-cbf0-df11-b725-001ec9e61285</epacsReference>
<postingDate>2010-11-15T15:19:45</postingDate>
<bankCurrency>EUR</bankCurrency>
<bankAmount>1.00</bankAmount>
<appliedCurrency>EUR</appliedCurrency>
<appliedAmount>1.00</appliedAmount>
<countryCode>ES</countryCode>
<bankInformation>Sean Wood</bankInformation>
<merchantReference>ESDEUR11039872</merchantReference>
</payment>
</PaymentNotification>
</soap:Body>
</soap:Envelope>
Используя SimpleXMl и namespaces / xpath, у меня есть доступ к тегу и значениям внутри. Однако единственный способ, которым я могу разобрать значения, - это циклически проходить по каждому элементу в узле, проверять его имя, и, если оно совпадает с моим сравнением строк, назначать его переменной массива. Я должен разобрать несколько платежей. Например:
//all payments
foreach($data->children() as $child) {
//one payment
foreach($child->children() as $subChild) {
switch($subChild->getName()) {
case "bankCurrency":
$newPayment['bankCurrency'] = (string)$subChild;
break;
case "bankPayment":
$newPayment['bankAmount'] = (string)$subChild;
break;
}
}
}
Это лучший способ сделать это? Или я совсем где-то пропустил? Спасибо!