【问题标题】:PHP: How to force simplexml to use certain datatype for a nodePHP:如何强制 simplexml 为节点使用某些数据类型
【发布时间】:2020-07-22 06:46:29
【问题描述】:

如何强制simplexml_load_string()在每个节点使用相同的数据结构。

$xml = "
<level1>
  <level2>
    <level3>Hello</level3>
    <level3>stackoverflow</level3>
  </level2>
  <level2>
    <level3>My problem</level3>
  </level2>
</level1>";

$xmlObj = simplexml_load_string($xml)
var_dump($xmlObj);

检查输出,

level1 是一个对象; level2 是一个数组; level2[0] 是一个数组。

level2[1] 是一个对象,因为只有一个子节点,我宁愿将其作为单个索引数组。

我正在从用户那里收集 xml,每个 level2 中可能有 1 个或多个节点。我的清理块是一个 foreach 循环,当level2 内只有一个节点时会失败。

卫生区看起来像这样

foreach($xmlObj -> level2 as $lvl2){
  if($lvl2 -> level3[0] == 'condition'){ doSomething( ); }
}

doSomething()&lt;level2&gt; 在 xml 字符串中总是有多个子节点时可以正常工作。如果&lt;level2&gt; 只有一个子&lt;level3&gt; 节点,则会出现尝试获取非对象属性的错误。

var_dump 显示数据类型根据嵌套的节点数从对象更改为数组。

我更喜欢一种方法来确保&lt;level2&gt; 始终是一个数组,无论其中有多少孩子。这使我免于编辑太多。但任何其他出路都足够了。

谢谢

【问题讨论】:

  • 忽略var_dump 的输出,因为这没有完全显示对象层次结构。如果您添加代码并在那里显示问题,那么它应该很容易修复。
  • 你如何检查第 2 级?,你也应该在你的帖子中包含它。 var_dump 和或print_r 有时会产生误导
  • @Rolf 为什么要将其转换为 JSON?
  • 这就是我问的原因。只是想有点开箱即用。

标签: php xml xml-parsing simplexml


【解决方案1】:

这不是 XML 本身可用的信息。所以你必须在你的实现中添加它。 SimpleXML 提供对子元素的列表和项目访问。如果您将其作为列表访问(例如使用 foreach),它将提供所有匹配的子元素。

$xml = "
<level1>
  <level2>
    <level3>Hello</level3>
    <level3>stackoverflow</level3>
  </level2>
  <level2>
    <level3>My problem</level3>
  </level2>
</level1>";

$level1 = new SimpleXMLElement($xml);

$result = [];
foreach($level1->level2 as $level2) {
    $data2 = [];
    foreach ($level2->level3 as $level3) {
        $data2[] = (string)$level3;
    }
    $result[] = $data2;
}

var_dump($result);

所以诀窍是直接使用 SimpleXMLElement 实例,而不是将其转换为数组。不要将 JSON 结构的创建视为通用转换。在使用 SimpleXML 读取 XML 时构建特定的输出。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-24
    • 1970-01-01
    • 2017-04-06
    • 2011-02-10
    • 2014-08-20
    相关资源
    最近更新 更多