【发布时间】:2016-10-07 08:34:17
【问题描述】:
我想将 XML 字符串转换为 SimpleXMLElement 对象时遇到问题。
这是我的 PHP 代码:
// XML string
$xmlStr = <<<XML
<?xml version='1.0'?>
<document>
<lastname lang="EN">Smith</lastname>
</document>
XML;
// Convert the XML string into an Array
$xml = simplexml_load_string($xmlStr);
$json = json_encode($xml);
$xmlArray = json_decode($json, true);
// Print SimpleXMLElement object
print_r($xml);
echo '<br /><br />';
// Print JSON
print_r($json);
echo '<br /><br />';
// Print XML Array
print_r($xmlArray);
echo '<br /><br />';
我得到了这个结果:
SimpleXMLElement Object ( [lastname] => Smith )
{"lastname":"Smith"}
Array ( [lastname] => Smith )
但是没有“lang”属性,我不知道我做错了什么...... :(
有人可以帮帮我吗?任何想法将不胜感激!提前致谢。
【问题讨论】:
-
是的,您不能使用
json_encode()将 SimpleXMLElement 转换为 JSON。它不仅会忽略属性,还会覆盖具有相同名称的标签(假设它们也具有相同的深度)。这不是一项简单的任务,所以你最好循环你的$xml并形成你想要的任何数组。 -
谢谢@sevavietl!我不知道
json_encode()如何与 SimpleXMLElement 对象一起工作。但它是在第一次使用simplexml_load_string($xmlStr)从 XML 字符串转换为 SimpleXMLElement 时,它已经忽略了“lang”属性。 XML 应该格式正确,所以我不知道为什么 SimpleXMLElement 对象不包含它。 -
它包含它,但没有与
print_r()一起显示整个内容,因为它具有相当复杂的结构。如果您将执行var_dump($xml->lastname)或print_r($xml->lastname),您将看到它本身就是SimpleXMLElement对象,并且现在将显示属性。 Try it yourself here. -
是的!非常感谢@sevavietl!现在我需要使用 stdClass 创建一个具有相同结构的类:
$xml = new stdClass(); $xml->lastname = new stdClass(); $xml->lastname->{'lang'} = 'EN'。当我执行print_r($xml->lastname->{'lang'})时,它显示“EN”,没关系。然后,我尝试$xml->lastname = 'Smith'设置内部文本的值,当我执行print_r($xml->lastname)时,结果是'Smith',完美,但我再次执行print_r($xml->lastname->{'lang'}),它什么也没显示。如何使用stdClass同时设置属性的值及其标签的内部文本? -
为什么需要这个?你想做什么?