simplexml_load_file - redundant element with empty value is converted to new SimpleXMLElement Object(Implexml_Load_FILE-将值为空的冗余元素转换为新的SimpleXMLElement对象)
问题描述
我使用implexml_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
               )
)
最好使用"Type"-name作为数组键,这样我就不必依赖XML文件中的顺序了。但数组中至少有一个空的XML元素值也应该是空值。
例如
<Stat Type="middle_name"></Stat>
应
[2] => 
改为
[2] => SimpleXMLElement Object
(
    [@attributes] => Array
    (
        [Type] => middle_name
    )
)
我可以通过以下方式解决这些问题:
- 依靠XML(数字索引)中的稳定订单
 - 验证值是否来自SimpleXMLElement类型以确定它是否为空。
 
但这对我来说不是一个好的解决方案。
我是不是做错了什么,或者我知道我能做什么?
非常感谢
推荐答案
我不太清楚您到底要求什么,但是如果您想知道SimpleXMLElement是否有节点值,您可以使用PHP中的strlen()函数。
它将接受SimpleXMLElement的字符串上下文,这是它的节点值(至少对于问题中的那些叶节点),因此当节点为空时返回0,如果包含文本则返回大于零。
SimpleXMLElement现成不支持通过属性值访问子对象。按照文档所述,数组访问用于访问属性,而不是子项;请参阅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):
";
foreach($team->Player as $i => $player)
{
    printf(" %d. %s %s
", $i + 1, $player->byType('first_name'), $player->byType('last_name'));
}
例如,您的问题中的简化示例生成根元素输出:
Team t684 Player(s):
 1. Manuel Neuer
您还可以在以下问题中找到通过SimpleXML大纲中的属性值访问子对象:
- SimpleXML: Selecting Elements Which Have A Certain Attribute Value (Dec 2009)
 - Access value through parent attribute (Jun 2010)
 - Help accessing xml attribute in php (Aug 2010)
 - Implementing condition in XPath (Aug 2010)
 
我上次在Stackoverflow上扩展SimpleXMLElement是在an answer到Displaying 5 latest thumbnails from public flickr api using atom_1 and php中。
不,实际上我上次在Stackoverflow上扩展SimpleXMLElement是在问题PHP/XML - how to read multible sub's
中这篇关于Implexml_Load_FILE-将值为空的冗余元素转换为新的SimpleXMLElement对象的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持编程学习网!
本文标题为:Implexml_Load_FILE-将值为空的冗余元素转换为新的SimpleXMLElement对象
				
        
 
            
        基础教程推荐
- 如何在数学上评估像“2-1"这样的字符串?产生“1"? 2022-01-01
 - 将变量从树枝传递给 js 2022-01-01
 - php 7.4 在写入变量中的 Twig 问题 2022-01-01
 - 主题化 Drupal 7 的 Ubercart “/cart"页 2021-01-01
 - php中的PDF导出 2022-01-01
 - php中的foreach复选框POST 2021-01-01
 - Yii2 - 在运行时设置邮件传输参数 2022-01-01
 - 使用 scandir() 在目录中查找文件夹 (PHP) 2022-01-01
 - PHPUnit 的 Selenium 2 文档到底在哪里? 2022-01-01
 - Web 服务器如何处理请求? 2021-01-01
 
    	
    	
    	
    	
    	
    	
    	
    	
				
				
				
				