PHP从XML迭代多个子项

PHP从XML迭代多个子项,php,xml,Php,Xml,我试图用PHP读取一个XML文件,该文件在父节点中有多个相同的命名节点。到目前为止,我可以读取XML节点的第一次迭代,但是PHP会移动到下一个父节点,即使还有另一个子节点需要读取。在本例中,是节点及其子节点 下面是xmlpass1.XML <LIST> <COMPANY>Alpha <DEVICE>Alpha1 <IPV4>1.2.3.4</IPV4> </DEVICE> <DEVICE>Al

我试图用PHP读取一个XML文件,该文件在父节点中有多个相同的命名节点。到目前为止,我可以读取XML节点的第一次迭代,但是PHP会移动到下一个父节点,即使还有另一个子节点需要读取。在本例中,是节点及其子节点

下面是xmlpass1.XML

<LIST>
 <COMPANY>Alpha
  <DEVICE>Alpha1
   <IPV4>1.2.3.4</IPV4>
  </DEVICE>
  <DEVICE>Alpha2
   <IPV4>5.6.7.8</IPV4>
  </DEVICE>
 </COMPANY>
 <COMPANY>Bravo
  <DEVICE>Bravo1
   <IPV4>1.3.5.7</IPV4>
  </DEVICE>
 </COMPANY>
</LIST>
如你所见,阿尔法公司和布拉沃公司分别列出了两种设备。这是我的PHP,我省略了HTML标记:

        $xml = simplexml_load_file("/var/www/xml/pass1.xml") or die ("Could not open file!");

        // Get Companies
        echo "Company List<br>";
        foreach($xml->children() as $company) {
                echo $company . "<br>";
        }

        echo "<br>Device List<br>";

        // Get devices
        foreach($xml->children() as $device) {
                echo $device->DEVICE . "<br>";
        }

    echo "<br>IP List<br>";

    // Get IP
    foreach($xml->children() as $ipv4) {
            echo $ipv4->DEVICE->IPV4 . "<br>";
    }
这些公司的运作正常,但对于这些设备,我只得到了Alpha1和Bravo1。类似地,对于IP地址,我只得到1.2.3.4和1.3.5.7,它们对应于被拉入的设备。我丢失了关于Alpha2的任何信息


我的最终目标是让每个设备和IPv4从PHP迭代并显示出来。有人能给我指出正确的方向吗?

我相信有更好的方法可以做到这一点,但这段代码解释了为什么您的代码不能正常工作

    // Get Companies
    echo "Company List<br>";
    foreach($xml->children() as $company) {
            echo $company . "<br>";
    }

    echo "<br>Device List<br>";

    // Get devices
    foreach($xml->children() as $company) {
        foreach ($company->children() as $device) {
            echo $device . "<br>";
        }
    }

    echo "<br>IP List<br>";

    // Get IP
    foreach($xml->children() as $company) {
            foreach ($company->children() as $device) {
                foreach ($device->children() as $IPV4) {
                    echo $IPV4 . "<br>";
                }
            }
    }
代码的问题在于,在每个循环中,您都试图提取不同的信息,但您的代码实际上只是重复提取第一个子项

所以这里

   // Get devices
    foreach($xml->children() as $device) {
            echo $device->DEVICE . "<br>";
    }
您试图从XML文件中获取每个设备,但实际上您正在从$XML中提取所有的第一个子项,它们是公司标记,第一个公司标记是Alpha和Bravo。然后用这两个公司标签中的每一个,你都在回显一个设备标签

所以你从Alpha和Bravo分别提取了一个设备标签。因此,解决方案是在foreach中添加另一层,在它循环通过两个公司标签之后,它再循环通过公司标签的下一层子标签,即设备标签


然后,对于IPV4,您可以执行相同的操作,但要添加另一个循环层

太棒了!它就像一个符咒。一旦你给我解释了,它就有意义了。谢谢