PHP从XML迭代多个子元素

时间:2017-05-11 01:48:13

标签: php xml

我试图在PHP中读取一个XML文件,该文件在父项中有多个同名的节点。到目前为止,我可以读取XML节点的第一次迭代,但是即使有另一个要读取的子节点,PHP也会移动到下一个父节点。在这种情况下,它是<DEVICE>节点及其子节点<IPV4>

这是XML(pass1.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>

正如您所看到的,&#34; Alpha&#34;中列出了两种设备。公司和#34; Bravo&#34;公司。这是我的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>";
    }

&#34;公司&#34;是正确的拉,但对于&#34;设备&#34;我只获得Alpha1Bravo1。同样,对于IP地址,我只得到1.2.3.41.3.5.7,它们与被拉出的设备相对应。我遗漏了Alpha2上的所有信息。

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

1 个答案:

答案 0 :(得分:1)

我确定有更好的方法可以做到这一点,但这段代码解释了为什么你的工作不正常。

    // 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文件中获取每个DEVICE,但实际上您从$ xml中提取了所有FIRST的子公司标签,而且两个FIRST COMPANY标签是Alpha和Bravo 。然后使用这两个公司标签中的每个标签,您回复一个单一设备标签。

所以你要从Alpha中提取一个SINGLE DEVICE标签,从Bravo中提取一个SINGLE DEVICE标签。所以解决方案是在foreach中添加另一个图层,然后在它遍历两个COMPANY标记之后,它循环遍历COMPANY标记的下一层子项,即DEVICE标记。

然后对于IPV4,您也会这样做,但添加另一个循环层。