无法解析 PHP 中的 XML 对象 (laravel 5.8)

Troubles parsing XML object in PHP (laravel 5.8)

我在解析 PHP 中的 XML 对象时遇到问题。我正在使用 Laravel 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,还有 SOAP。我建议使用 SOAP 库(如 ext/soap)。

Envelope 而不是 Envalop。这是您 $xml 变量中的元素。

如果您只想将其视为 XML,请不要依赖命名空间前缀,而要依赖实际的命名空间 URI(xmlns 属性的值)。前缀可以改变。像 ns3 这样的前缀是由 SOAP 库自动生成的,只需 adding/removing 具有另一个命名空间的元素就可以更改它。因此,为 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')
);