访问 Simplexml 中具有复杂结构的元素


Accessing elements in Simplexml with complex structure

我是用 PHP 使用 XML 的新手。我有一个相当复杂的XML结构,并且在laravel中使用simplexml,并且在访问我需要获取的所有元素时遇到问题。我能够遍历大型 XML 文件,但 simpleXML 每条记录返回两个对象,我似乎只能访问"header"中的元素,返回的第一个对象......

这是 XML 对象的一部分

SimpleXMLElement Object
(
    [identifier] => RCM0635
    [datestamp] => 2015-06-09
)
SimpleXMLElement Object
(
    [lidoWrap] => SimpleXMLElement Object
    (
        [lido] => SimpleXMLElement Object
            (
                [lidoRecID] => RCM:1748
                [descriptiveMetadata] => SimpleXMLElement Object
                    (
                        [objectClassificationWrap] => SimpleXMLElement Object
                            (
                                [objectWorkTypeWrap] => SimpleXMLElement Object
                                    (
                                        [objectWorkType] => SimpleXMLElement Object
                                            (
                                                [term] => musical instruments
                                            )
                                    )
                                [classificationWrap] => SimpleXMLElement Object
                                    (
                                        [classification] => Array
                                            (
                                                [0] => SimpleXMLElement Object
                                                    (
                                                        [term] => Cornet
                                                    )
                                                [1] => SimpleXMLElement Object
                                                    (
                                                        [conceptID] => SimpleXMLElement Object
                                                            (
                                                                [@attributes] => Array
                                                                    (
                                                                        [type] => SH_Class
                                                                    )
                                                            )
                                                    )
                                            )
                                    )
                            )

使用下面的代码,我可以获取标题中的元素,但我不知道如何获取其他元素?

    $streamer = 'Prewk'XmlStringStreamer::createStringWalkerParser(public_path().'/xml/many_mimo_records.xml');

                while ($node = $streamer->getNode()) {
                    $simpleXmlNode = simplexml_load_string($node);
                    echo (string)$simpleXmlNode->identifier;
                    echo (string)$simpleXmlNode->datestamp;
                }

我将非常感谢任何建议...

我不确定我是否理解你,但在专业:

  1. 你按照循环while ($node = $streamer->getNode())操作,这意味着在第一次迭代后,你会得到这个对象:

SimpleXMLElement Object ( [identifier] => RCM0635 [datestamp] => 2015-06-09 )

所以第一次可以这样读:

' $simpleXmlNode = simplexml_load_string($node); 回显(字符串)$simpleXmlNode>标识符; 回显(字符串)$simpleXmlNode->日期戳;

'

但在第二次迭代中,您有:

'

SimpleXMLElement Object
(
    [lidoWrap] => SimpleXMLElement Object
    (
        [lido] => SimpleXMLElement Object
            (
                [lidoRecID] => RCM:1748
                [descriptiveMetadata] => SimpleXMLElement Object
                    (
                        [objectClassificationWrap] => SimpleXMLElement Object
                            (
                                [objectWorkTypeWrap] => SimpleXMLElement Object
                                    (
                                        [objectWorkType] => SimpleXMLElement Object
                                            (
                                                [term] => musical instruments
                                            )
                                    )
                                [classificationWrap] => SimpleXMLElement Object
                                    (
                                        [classification] => Array
                                            (
                                                [0] => SimpleXMLElement Object
                                                    (
                                                        [term] => Cornet
                                                    )
                                                [1] => SimpleXMLElement Object
                                                    (
                                                        [conceptID] => SimpleXMLElement Object
                                                            (
                                                                [@attributes] => Array
                                                                    (
                                                                        [type] => SH_Class
                                                                    )
                                                            )
                                                    )
                                            )
                                    )
                            )

'

所以里面的代码是错误的。

我最想尝试这样的事情:

'

while ($node = $streamer->getNode()) {
    $simpleXmlNode = simplexml_load_string($node);
    if (!empty($simpleXmlNode->identifier))
        echo (string)$simpleXmlNode->identifier;
    if (!empty($simpleXmlNode->datestamp))
        echo (string)$simpleXmlNode->datestamp;
    if (!empty($simpleXmlNode->lidoWrap)) {
        $lido = $simpleXmlNode->lidoWrap->lido;
        echo (string)$lido->lidoRecID;
        // and so on as the recursive XML node objects
    }
}

'