【问题标题】:How do I convert XML tags with attributes and inner text at the same time into a SimpleXMLElement object in PHP?如何将带有属性和内部文本的 XML 标签同时转换为 PHP 中的 SimpleXMLElement 对象?
【发布时间】: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-&gt;lastname)print_r($xml-&gt;lastname),您将看到它本身就是SimpleXMLElement 对象,并且现在将显示属性。 Try it yourself here.
  • 是的!非常感谢@sevavietl!现在我需要使用 stdClass 创建一个具有相同结构的类:$xml = new stdClass(); $xml-&gt;lastname = new stdClass(); $xml-&gt;lastname-&gt;{'lang'} = 'EN'。当我执行print_r($xml-&gt;lastname-&gt;{'lang'}) 时,它显示“EN”,没关系。然后,我尝试$xml-&gt;lastname = 'Smith' 设置内部文本的值,当我执行print_r($xml-&gt;lastname) 时,结果是'Smith',完美,但我再次执行print_r($xml-&gt;lastname-&gt;{'lang'}),它什么也没显示。如何使用stdClass同时设置属性的值及其标签的内部文本?
  • 为什么需要这个?你想做什么?

标签: php xml simplexml


【解决方案1】:

设置“姓氏”标签的文本值“史密斯”:

$xml->lastname->{'_'}

希望对你有帮助!

【讨论】:

    【解决方案2】:

    json_encode 函数不会在任何只有文本的节点上添加 xml 属性。如果最终元素只是文本,并且在这种情况下您需要使用另一个属性作为 lang,则必须添加另一个封闭标记。我总是使用 _value,和 Mootools XmlToJsObject library 一样。

    我写了一个小PHPtest.

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-12-14
      • 1970-01-01
      • 1970-01-01
      • 2016-08-01
      • 1970-01-01
      • 2017-08-28
      • 1970-01-01
      • 2011-04-30
      相关资源
      最近更新 更多