У меня проблемы с анализом объекта XML в PHP. Я использую Ларавель 5.8
Вот одна из моих попыток:
$xml = new \SimpleXMLElement($formatted, LIBXML_BIGLINES);
var_dump($xml->children('soapenv', true)->Envalop->Body->children('ns3', true)->getAddressBookResponse->addressBook[0]->businessUnit);
И я получаю следующую ошибку:
Call to a member function children() on null
Я пробовал разные варианты создания и доступа к SimpleXMLElement, но всегда с одним и тем же результатом. Я возвращаю пустой объект типаSimpleXMLElement
Вот пример XML, который я использую в качестве входных данных (исходя из вызова SOAP API):
<?xml version = "1.0" encoding = "UTF-8"?>
<soapenv:Envelope xmlns:soapenv = "http://schemas.xmlsoap.org/soap/envelope/">
<soapenv:Body>
<ns3:getAddressBookResponse xmlns:ns2 = "http://oracle.e1.bssv.JPRCUST0/"
xmlns:ns3 = "http://oracle.e1.bssv.JPR01000/">
<e1MessageList>
<e1Messages>
<message>Description: All records for the query have not been returned.
</message>
</e1Messages>
</e1MessageList>
<addressBook>
<businessUnit>123456</businessUnit>
<categoryCodesAddressBook>
<categoryCode001>XXX</categoryCode001>
<categoryCode002>XXX</categoryCode002>
</categoryCodesAddressBook>
<description1>MOHAMEDHASSANALI</description1>
</addressBook>
<addressBook>
<businessUnit>789789</businessUnit>
<categoryCodesAddressBook>
<categoryCode001>YYY</categoryCode001>
<categoryCode002>YYY</categoryCode002>
</categoryCodesAddressBook>
<description1>ALIHASSANAHMED</description1>
</addressBook>
</ns3:getAddressBookResponse>
</soapenv:Body>
</soapenv:Envelope>
@BhavinThummar Моя проблема заключается в создании объекта XML, а не в доступе к нему. Я возвращаю пустой объект. В любом случае спасибо за ваш комментарий.
Пожалуйста, проверьте ссылку ниже php.net/manual/en/simplexmlelement.addchild.php, я думаю, это может помочь.






Это не просто XML, а SOAP. Я предлагаю использовать библиотеку SOAP (например, ext/soap).
Это Envelope не Envalop. И это элемент в вас $xml переменной.
Если вы хотите рассматривать его как просто XML, полагайтесь не на префиксы пространств имен, а на фактические URI пространств имен (значения атрибутов xmlns). Префиксы могут меняться. Префикс типа ns3 автоматически генерируется библиотекой SOAP, простое добавление/удаление элемента с другим пространством имен может изменить его. Поэтому определите константы или переменные для значений XMLNS и используйте их.
const XMLNS_SOAP = 'http://schemas.xmlsoap.org/soap/envelope/';
const XMLNS_ADDRESSES = 'http://oracle.e1.bssv.JPR01000/';
$envelope = new \SimpleXMLElement($formatted, LIBXML_BIGLINES);
var_dump(
$envelope->children(XMLNS_SOAP)->Body->children(XMLNS_ADDRESSES)->getAddressBookResponse->children('')->addressBook[0]->businessUnit
);
Выражения Xpath (SimpleXMLElement::xpath()) позволяют выполнять условную выборку. Это позволяет избежать проблем, если элемент отсутствует, но вам придется зарегистрировать свои собственные префиксы для пространств имен.
const XMLNS_SOAP = 'http://schemas.xmlsoap.org/soap/envelope/';
const XMLNS_ADDRESSES = 'http://oracle.e1.bssv.JPR01000/';
$envelope = new \SimpleXMLElement($formatted, LIBXML_BIGLINES);
$envelope->registerXpathNamespace('s', XMLNS_SOAP);
$envelope->registerXpathNamespace('a', XMLNS_ADDRESSES);
var_dump(
$envelope->xpath('(s:Body/a:getAddressBookResponse/addressBook)[1]/businessUnit')
);
Вы можете проверить эту ссылку, если хотите получить информацию о дочерних элементах xml, используя основную функцию PHP. geeksforgeeks.org/php-simplexmlelement-children-функция