PHP: 如何强制 simplexml 为节点使用特定数据类型

PHP: How to force simplexml to use certain datatype for a node

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

$xml = "
<level1>
  <level2>
    <level3>Hello</level3>
    <level3>Whosebug</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()<level2> 总是在 xml 字符串中有多个子节点时工作正常。如果 <level2> 只有一个子 <level3> 节点,则会出现有关尝试获取非对象属性的错误。

var_dump 显示数据类型从对象变为数组,具体取决于嵌套在其中的节点数。

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

谢谢

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

$xml = "
<level1>
  <level2>
    <level3>Hello</level3>
    <level3>Whosebug</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 时构建特定的输出