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'.
下所有属性的数组
当我尝试使用 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'.
下所有属性的数组