Php simplexml\u load\u file-具有空值的冗余元素被转换为新的SimpleXMLElement对象

Php simplexml\u load\u file-具有空值的冗余元素被转换为新的SimpleXMLElement对象,php,xml,xml-parsing,simplexml,Php,Xml,Xml Parsing,Simplexml,我使用simplexml\u load\u文件将XML文件转换为对象。 当redunant元素有空值时,我注意到了一个问题 我认为这个例子更容易理解: // XML-File (Just a small excerpt look at "...") ... <Team uID="t684"> ... <Player loan="" uID="p20388"> <Name>Manuel Neuer</Name>

我使用simplexml\u load\u文件将XML文件转换为对象。 当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
               )
)
反而

[2] => SimpleXMLElement Object
(
    [@attributes] => Array
    (
        [Type] => middle_name
    )
)
我可以通过以下方式解决这些问题:

  • XML中的稳定顺序计数(数字索引)
  • 验证值是否来自SimpleXMLElement类型,以确定其是否为空 但这对我来说似乎不是个好办法

    我做错什么了吗?或者我能做什么


    非常感谢

    我不太清楚你到底想要什么,但是如果你想知道SimpleXMLElement是否有节点值,你可以使用PHP中的
    strlen()
    函数

    它将采用SimpleXMLElement的字符串上下文,该字符串上下文是它的节点值(至少对于您问题中的那些叶节点),因此当节点为空时将返回0,如果包含文本,则返回大于零

    SimpleXMLElement开箱即用不支持通过属性值访问子级。数组访问按照文档记录的方式工作,以访问属性,而不是子级;看

    但是,您可以扩展SimpleXMLElement以添加该功能,例如通过
    类型
    属性值获取子项:

    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 t684 Player(s):
     1. Manuel Neuer
    
    您可以在SimpleXML大纲中找到通过属性值访问子级的问题,也可以在以下问题中找到:

    上一次我在Stackoverflow上扩展SimpleXMLElement是在到中


    不,事实证明,上次我在Stackoverflow上扩展SimpleXMLElement时遇到了一个问题

    甚至认为您使用了
    print\r
    提供给您的信息不是真实的信息。simplexml只能提供信息。相反,您的认知基于这样一个事实:SimpleXML有很多魔力,您最好使用它提供的
    asXML()
    方法转储它的内容,而不是
    print\r
    var\u dump
    。我打赌这已经让你80%的问题标记过时了。非常好的建议,谢谢!如果我打印一个单独的统计数据,它看起来像是“空的”——加上一个带有特定值的0索引。Stat[1]返回值。Stat[1][“Type”]返回“Type”-名称,Stat[1][0]也返回值。因此,类型的开关盒是最好的。谢谢这是SimpleXMLElement中的另一个神奇的东西
    $element[0]
    是所谓的自引用,因此
    $element[1][0]
    是该列表中第二个元素的自引用。困惑的我想是的。谢谢你的解释。我想将XML中的数据保存到数据库中。但现在我知道如何使用它了。你的链接示例#5(开关)正是我现在要做的。如果你仍然对按属性值访问感兴趣,我也找到了这个。原来我复制了我的东西却没有意识到:/:)
    $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 t684 Player(s):
     1. Manuel Neuer