2016-04-25 51 views
0

我是用PHP与XML一起工作的新手。我有一个相当复杂的XML结构,并且在laravel中使用simplexml,并且无法访问我需要获取的所有元素。我能够遍历大型的XML文件,但simpleXML每个记录返回两个对象,我似乎只能访问'标题'中的元素,第一个对象返回...在Simplexml中访问复杂结构中的元素

这里是部分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; 

       } 

我会为任何建议非常感谢......

回答

0

我不知道如果我理解你,但在重大:

  1. 你的行为对while ($node = $streamer->getNode())环是什么意思是第一次迭代后,您会得到这个对象:

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

所以第一次可以这样读取它:

` $ simpleXmlNode = simplexml_load_string($ node); echo(string)$ simpleXmlNode-> identifier; echo(string)$ simpleXmlNode-> datestamp;

`

,但在第二次迭代您有:

`

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 
                    ) 

                  ) 

                ) 

              ) 

            ) 

          ) 

`

因此,虽然里面的代码是错误的。

我sugest尝试这样的事:

`

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 
    } 
} 

`