无法解析 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')
);
我在解析 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')
);