将具有多个命名空间的 XML 解析为 JSON - PHP
Parse XML with multiple namespace to JSON - PHP
我想访问 XML 并将其解析为 JSON。
<?xml version='1.0' encoding='UTF-8'?>
<soapenv:Envelope xmlns:soapenv='http://schemas.xmlsoap.org/soap/envelope/' xmlns:ser='http://service.billing.org/'>
<soapenv:Header />
<soapenv:Body>
<ser:processTrans>
<xmlValue>
<![CDATA[
<ebpacket>
<head>
<packettype> UserAuthorization</packettype>
<staffcode> ePay_UserName </staffcode>
<pwd> ePay_Password </pwd>
</head>
<body>
<email> _username </email>
<loginpwd> _password </loginpwd>
<deviceid> DeviceId </deviceid>
</body>
</ebpacket>
]]>
</xmlValue>
</ser:processTrans>
我可以通过以下方式访问这些值:
$xml_str = str_replace(PHP_EOL, '', $xmlstr);
$xml = SimpleXML_Load_String($xml_str,'SimpleXMLElement', LIBXML_NOCDATA, "http://schemas.xmlsoap.org/soap/envelope/");
$xml->registerXPathNamespace('ser', 'http://service.billing.org');
$j_obj = json_encode($xml->xpath('//soapenv:Body'));
问题是,XML 结构是事先不知道的。因此,我无法通过命名空间专门访问。除非我指定命名空间 $xml->xpath('//soapenv:Body'),否则它不会 return 预期结果。
我认为您混淆了两个命名空间,您试图将 soapenv
前缀与用于 ser
的 URI 一起注册。这并不是说这会影响代码,但它可能不会达到您的预期。
至于事先不知道命名空间,在 SimpleXML 中,您可以使用 getDocNamespaces()
从文档中获取命名空间,然后循环并根据前缀注册它们。所以下面的代码获取 Body 的 XML 内容...
$xml_str = str_replace(PHP_EOL, '', $xmlstr);
$xml = simplexml_load_string($xml_str,'SimpleXMLElement', LIBXML_NOCDATA);
$ns = $xml->getDocNamespaces(true);
foreach ( $ns as $prefix => $URI ) {
$xml->registerXPathNamespace($prefix, $URI);
}
$j_obj = json_encode($xml->xpath('//soapenv:Body/*'));
我想访问 XML 并将其解析为 JSON。
<?xml version='1.0' encoding='UTF-8'?>
<soapenv:Envelope xmlns:soapenv='http://schemas.xmlsoap.org/soap/envelope/' xmlns:ser='http://service.billing.org/'>
<soapenv:Header />
<soapenv:Body>
<ser:processTrans>
<xmlValue>
<![CDATA[
<ebpacket>
<head>
<packettype> UserAuthorization</packettype>
<staffcode> ePay_UserName </staffcode>
<pwd> ePay_Password </pwd>
</head>
<body>
<email> _username </email>
<loginpwd> _password </loginpwd>
<deviceid> DeviceId </deviceid>
</body>
</ebpacket>
]]>
</xmlValue>
</ser:processTrans>
我可以通过以下方式访问这些值:
$xml_str = str_replace(PHP_EOL, '', $xmlstr);
$xml = SimpleXML_Load_String($xml_str,'SimpleXMLElement', LIBXML_NOCDATA, "http://schemas.xmlsoap.org/soap/envelope/");
$xml->registerXPathNamespace('ser', 'http://service.billing.org');
$j_obj = json_encode($xml->xpath('//soapenv:Body'));
问题是,XML 结构是事先不知道的。因此,我无法通过命名空间专门访问。除非我指定命名空间 $xml->xpath('//soapenv:Body'),否则它不会 return 预期结果。
我认为您混淆了两个命名空间,您试图将 soapenv
前缀与用于 ser
的 URI 一起注册。这并不是说这会影响代码,但它可能不会达到您的预期。
至于事先不知道命名空间,在 SimpleXML 中,您可以使用 getDocNamespaces()
从文档中获取命名空间,然后循环并根据前缀注册它们。所以下面的代码获取 Body 的 XML 内容...
$xml_str = str_replace(PHP_EOL, '', $xmlstr);
$xml = simplexml_load_string($xml_str,'SimpleXMLElement', LIBXML_NOCDATA);
$ns = $xml->getDocNamespaces(true);
foreach ( $ns as $prefix => $URI ) {
$xml->registerXPathNamespace($prefix, $URI);
}
$j_obj = json_encode($xml->xpath('//soapenv:Body/*'));