我使用simplexml_load_file将XML文件转换为Object。 当redunant元素的值为空时,我注意到了一个问题。
我认为这个例子让它更容易理解:
// 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
)
)
当“Type”-name用作Array Key时,这将是最好的,所以我不必指望xml文件中的顺序。但至少一个空的xml元素值也应该是数组中的空值。
e.g。
<Stat Type="middle_name"></Stat>
应该是
[2] =>
代替
[2] => SimpleXMLElement Object
(
[@attributes] => Array
(
[Type] => middle_name
)
)
我可以通过以下方式处理这些问题:
但这对我来说似乎不是一个好的解决方案。
我做错了什么或有什么想法我能做什么?
非常感谢
答案 0 :(得分:0)
我最后还不清楚你最后要求 ,但是如果你想知道SimpleXMLElement是否有Node-Value,你可以利用PHP中的strlen()
函数。
它将采用SimpleXMLElement的字符串上下文,它是它的节点值(至少对于你的问题中的那些叶节点),因此当节点为空时将返回0,如果它包含文本则返回大于0
SimpleXMLElement不支持通过属性值访问子项。 Array-Access按照文档记录的方式访问属性,而不是子项;请参阅Example #5 Using attributes。
但是,您可以扩展SimpleXMLElement以添加该功能,例如通过Type
属性值获取子项:
class MyXMLElement extends SimpleXMLElement
{
public function byType($value) {
list($result) = ((array)$this->getByAttribute('Type', $value)) + array(NULL);
return $result[0];
}
public function getByAttribute($attribute, $value) {
return $this->xpath(sprintf('.//*[@%s = "%s"]', $attribute, $value));
}
}
可以使用此新变体代替旧变体,以便您可以轻松访问所需内容:
$team = simplexml_load_string($buffer, 'MyXMLElement');
echo "Team ", $team['uID'], " Player(s):\n";
foreach($team->Player as $i => $player)
{
printf(" %d. %s %s\n", $i + 1, $player->byType('first_name'), $player->byType('last_name'));
}
例如,您在问题中得到了简化示例<Team>
根元素输出:
Team t684 Player(s):
1. Manuel Neuer
您可以在SimpleXML大纲中找到按属性值访问子项的问题,以下问题:
上次我将Stackoverflow上的SimpleXMLElement扩展到an answer到Displaying 5 latest thumbnails from public flickr api using atom_1 and php。
不,实际上我上次在Stackoverflow上扩展了SimpleXMLElement explaining exactly the same access by attribute value thing中的问题是PHP/XML - how to read multible sub's