Проблемы с разбором объекта XML в PHP (laravel 5.8)

У меня проблемы с анализом объекта 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>

Вы можете проверить эту ссылку, если хотите получить информацию о дочерних элементах xml, используя основную функцию PHP. geeksforgeeks.org/php-simplexmlelement-children-функция

Bhavin Thummar 17.07.2019 08:30

@BhavinThummar Моя проблема заключается в создании объекта XML, а не в доступе к нему. Я возвращаю пустой объект. В любом случае спасибо за ваш комментарий.

Hassan Al-Jeshi 17.07.2019 08:32

Пожалуйста, проверьте ссылку ниже php.net/manual/en/simplexmlelement.addchild.php, я думаю, это может помочь.

Bhavin Thummar 17.07.2019 09:23
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
1
3
358
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Это не просто 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')
);

Другие вопросы по теме