【发布时间】:2013-07-01 11:59:47
【问题描述】:
我使用 simplexml_load_file 将 XML 文件转换为对象。 当冗余元素具有空值时,我注意到了一个问题。
我认为这个例子更容易理解:
// XML-File (Just a small excerpt look at "...")
...
<Team uID="t684">
...
<Player loan="" uID="p20388">
<Name>Manuel Neuer</Name>
<Position>Goalkeeper</Position>
<Stat Type="first_name">Manuel</Stat>
<Stat Type="last_name">Neuer</Stat>
<Stat Type="middle_name"></Stat>
<Stat Type="known_name"></Stat>
<Stat Type="birth_date">1986-03-27</Stat>
<Stat Type="birth_place"></Stat>
<Stat Type="first_nationality"></Stat>
<Stat Type="deceased"></Stat>
<Stat Type="preferred_foot"></Stat>
<Stat Type="weight">92</Stat>
<Stat Type="height">193</Stat>
<Stat Type="jersey_num">1</Stat>
<Stat Type="real_position">Goalkeeper</Stat>
<Stat Type="real_position_side">Unknown</Stat>
<Stat Type="join_date">2011-07-01</Stat>
<Stat Type="country">Germany</Stat>
</Player>
...
</Team>
...
// print_r (simplexml_load_file)
...
[Player] => Array
(
[0] => SimpleXMLElement Object
(
[@attributes] => Array
(
[loan] =>
[uID] => p20388
)
[Name] => Manuel Neuer
[Position] => Goalkeeper
[Stat] => Array(
[0] => Manuel
[1] => Neuer
[2] => SimpleXMLElement Object
(
[@attributes] => Array
(
[Type] => middle_name
)
)
[3] => SimpleXMLElement Object
(
[@attributes] => Array
(
[Type] => known_name
)
)
[4] => 1986-03-27
[5] => SimpleXMLElement Object
(
[@attributes] => Array
(
[Type] => birth_place
)
)
[6] => SimpleXMLElement Object
(
[@attributes] => Array
(
[Type] => first_nationality
)
)
[7] => SimpleXMLElement Object
(
[@attributes] => Array
(
[Type] => deceased
)
)
[8] => SimpleXMLElement Object
(
[@attributes] => Array
(
[Type] => preferred_foot
)
)
[9] => 92
[10] => 193
[11] => 1
[12] => Goalkeeper
[13] => Unknown
[14] => 2011-07-01
[15] => Germany
)
)
最好将“类型”名称用作数组键,这样我就不必依赖 xml 文件中的顺序。但至少一个空的xml元素值也应该是数组中的一个空值。
例如
<Stat Type="middle_name"></Stat>
应该是
[2] =>
改为
[2] => SimpleXMLElement Object
(
[@attributes] => Array
(
[Type] => middle_name
)
)
我可以通过以下方式解决这些问题:
- 依靠 XML 中的稳定顺序(数字索引)
- 证明值是否来自 SimpleXMLElement 类型以确定它是否为空。
但这对我来说似乎不是一个好的解决方案。
我是不是做错了什么或者有什么想法可以做什么?
非常感谢
【问题讨论】:
-
即使您以为您使用
print_r,呈现给您的信息也不是真实信息。它只是 informative 与 simplexml。相反,您的认知基于 SimpleXML 有很多魔力这一事实,您最好使用它提供的asXML()方法而不是print_r或var_dump来转储它的内容。我敢打赌,这已经使你 80% 的问题标记过时了。 -
很好的建议,谢谢!如果我 print_r 一个单独的 Stat 它看起来像“空” - 添加一个具有特定值的 0 索引。 Stat[1] 返回值。 Stat[1]["Type"] 返回“Type”-name,Stat[1][0] 也返回值。因此,Type 的 Switch-Case 将是最好的。谢谢
-
这是 SimpleXMLElement 中另一个神奇的东西。
$element[0]是所谓的自引用,因此$element[1][0]是该列表中第二个元素的自引用。困惑?我想是的。
标签: php xml xml-parsing simplexml