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 时构建特定的输出
如何强制 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 时构建特定的输出