PHP:XML 到 JSON 失败

PHP: XML to JSON fails

当我尝试使用 json_encode 将 XML(simpleXML) 转换为 JSON 时,它适用于没有命名空间的 XML。 例如:

<ebpacket> 
   <head> 
      <packettype> UserAuthorization</packettype>
      <staffcode> UserName  </staffcode> 
      <pwd>  Password  </pwd> 
      <env>  Evnironment  </env> 
   </head> 
</ebpacket>

当我像下面这样使用属性转换 XML 时,json_encode returns 一个空的 json:

<soapenv:Envelope xmlns:soapenv='http://schemas.xmlsoap.org/soap/envelope/>
 <soapenv:Header />
 <soapenv:Body>
  <ser:processTrans>
     <xmlValue>
            <ebpacket> 
                <head> 
                    <packettype> UserAuthorization</packettype>
                    <staffcode> UserName  </staffcode> 
                    <pwd> Password  </pwd> 
                    <env>  Evnironment  </env> 
                </head> 
            </ebpacket>
    </xmlValue>
  </ser:processTrans>

我使用的代码块是:

        $xml_str = str_replace(PHP_EOL, '', $xmlstr);
        $xml = simplexml_load_string($xml_str,'SimpleXMLElement',LIBXML_NOCDATA);
        $json_object = json_encode($xml, JSON_PRETTY_PRINT);

通读后,我发现您必须注册您的命名空间才能访问具有命名空间前缀的节点。 例如:

$xml= SimpleXML_Load_String($xml_str,'SimpleXMLElement', LIBXML_NOCDATA, "http://schemas.xmlsoap.org/soap/envelope/");

这将 return 一个 XML object 只有 Head 和 Body。它将 return 具有其他前缀的任何节点。在上面的示例中,它不会 return 前缀 'ser' 下的节点。返回的 XML 将是;

<Header></Header>
<Body></Body>

为了能够访问其他节点,您必须使用注册命名空间并查询它。

$xml->registerXPathNamespace('ser', 'http://w3c.soap.envelope.org/');
$result = $xml->xpath('//ser:*');

$result 将是一个包含节点 'ser:processTrans'.

下所有属性的数组