我试图在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;我只获得Alpha1
和Bravo1
。同样,对于IP地址,我只得到1.2.3.4
和1.3.5.7
,它们与被拉出的设备相对应。我遗漏了Alpha2
上的所有信息。
我的最终目标是让每个Device
和IPv4
从PHP迭代并显示出来。有人能指出我正确的方向吗?
答案 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,您也会这样做,但添加另一个循环层。