由于我是PHP的新手,因此我在围绕这个问题时遇到了一些困难。
XML文档包含:
<containerDetails>
<ID> theid </id>
<OwnerDetails id = 23212>
<name> the name </name>
</OwnerDetails>
<OtherData>
asdfdsa
</OtherData>
</containerDetails>
我可以通过$current["OwnerDetails"]["Name"]
确认
但有时会有多个所有者详细信息:
<containerDetails>
<ID> theid </id>
<OwnerDetails id = 23212>
<name> the name </name>
</OwnerDetails>
<OwnerDetails id = 23233>
<name> other name </name>
</OwnerDetails>
<OtherData>
asdfdsa
</OtherData>
</containerDetails>
我可以使用
foreach($current["OwnerDetails"] as $row)
echo $row["Name"]
我看到两个名字。但如果只有一个OwnerDetails,它就不会正确显示名称....即使我不知道是否会有一个或多个项目,我如何可靠地访问这些数据?
答案 0 :(得分:3)
处理此问题的最简单方法可能类似于以下内容,具体取决于您的XML解析库:
// make sure you have an array containing OwnerDetails elements
$ownerDetails = isset($current["OwnerDetails"][0])
? $current["OwnerDetails"]
: array($current["OwnerDetails"]);
// now iterate over it
foreach ($ownerDetails as $row) {
echo $row["Name"];
}
但是,SimpleXML可以为您解决此问题; SimpleXMLElement对象实现了Traversable接口,因此您可以在任一场景中使用foreach
。
答案 1 :(得分:1)
我不确定您正在使用什么XML解析功能,因此很难调整其精确行为。
如果您使用SimpleXML,那么foreach ( $current->OwnerDetails as $row )
应该适用于这两种情况。同样,$current->OwnerDetails->Name
和$current->OwnerDetails[0]->Name
都可以获得第一个孩子的Name
。 SimpleXML重载功能可以在这种情况下顺利运行。
请注意->
表示法(属性访问权限)以引用子节点。在SimpleXML中,['string']
表示法访问属性,例如$current->OwnerDetails['id']
。