php - PHP Foreach 保存 ID
问题描述
我有所谓的“GAEB”文件,它们是 XML 结构的。我通过 foreach 和 simplexml 遍历这些。
XML/GAEB 文件:
<GAEB>
<Award>
<BoQ>
<BoQBody>
<BoQCtgy RNoPart="01">
<BoQBody>
<BoQCtgy RNoPart="01">
<BoQBody>
<BoQCtgy>
<BoQBody RNoPart="01">
<Itemlist>
<Item RNoPart="1">
<Item RNoPart="2">
</Itemlist>
</BoQBody>
</BoQCtgy>
<BoQCtgy>
<BoQBody RNoPart="02">
<Itemlist>
<Item RNoPart="1">
<Item RNoPart="2">
</Itemlist>
</BoQBody>
</BoQCtgy>
</BoQBody>
</BoQCtgy>
<BoQCtgy RNoPart="02">
<BoQBody>
<BoQCtgy>
<BoQBody RNoPart="01">
<Itemlist>
<Item RNoPart="1">
<Item RNoPart="2">
</Itemlist>
</BoQBody>
</BoQCtgy>
<BoQCtgy>
<BoQBody RNoPart="02">
<Itemlist>
<Item RNoPart="1">
<Item RNoPart="2">
</Itemlist>
</BoQBody>
</BoQCtgy>
</BoQBody>
</BoQCtgy>
</BoQBody>
</BoQCtgy>
</BoQBody>
</BoQ>
</Award>
</GAEB>
我的 PHP 代码循环遍历所有 $xml->BoQBody->BoQCtgy 直到找到一个 Itemlist。然后遍历该 Itemlist 并从那里获取一些信息。之后再次开始循环。
PHP:
<?php
$file = "pathtoxmlfile";
$xml = simplexml_load_file($file);
function loop($path, $xml){
foreach($path->BoQBody->BoQCtgy as $BoQCtgy){
$nr = $BoQCtgy->attributes()["RNoPart"];
echo $nr;
if(ISSET($BoQCtgy->BoQBody->Itemlist) === TRUE{
foreach($BoQCtgy->BoQBody->Itemlist->Item as $item){
$pos = $item->attributes()["RNoPart"];
echo $pos;
}
}
}
loop($BoQCtgy,$xml);
}
loop($xml->Award->BoQ,$xml);
?>
我如何获得所有职位的清晰编号?上面的例子应该是:
01
01.01
01.01.01
01.01.01.1
01.01.01.2
01.01.02
01.01.02.1
01.01.02.2
问题是,深度每次都是另一个。我使用 PHP 代码获得了我需要的所有位置和所有值,没有任何问题。但是我找不到匹配的编号...
希望有人知道解决方案。
解决方案
使用 XPath,您不必担心项目的深度。在这种情况下,它首先使用...查找具有RNoPart
属性的任何节点//*[@RNoPart]
- // - 任何级别
- 任何节点
- [@RNoPart] - 带有 RNoPart 属性(
@
表示属性)
它循环遍历结果,然后使用ancestor
XPath 中的轴来查找具有另一个 RNoPart 属性的所有父元素,使用ancestor::*/@RNoPart
.
当它循环这些(在本例中)时,它只输出值,然后.
在每个子集之后加上 a 和一个新行。
所以放在一起,你得到...
foreach ( $xml->xpath("//*[@RNoPart]") as $part ) {
foreach ( $part['RNoPart']->xpath("ancestor::*/@RNoPart") as $part ) {
echo $part.".";
}
echo PHP_EOL;
}
并使用您的示例 XML,输出...
01.
01.01.
01.01.01.
01.01.01.1.
01.01.01.2.
01.01.02.
01.01.02.1.
01.01.02.2.
01.02.
01.02.01.
01.02.01.1.
01.02.01.2.
01.02.02.
01.02.02.1.
01.02.02.2.
推荐阅读
- .htaccess - 删除 .htaccess 中的 GET 参数并获取 2 个 URL
- algorithm - 检查 IP 地址是否在该本地网络上?
- ios - 有没有办法让 NEHotspotConfigurationManager 同意加入网络一次?
- python - 如何在程序中返回 mpiexec -n 参数?
- flask - 如何在烧瓶的另一条路线中使用一条路线中的变量?
- javascript - 如何将两个孩子喂给 React 组件并使用值?
- r - 根据列值对应减去嵌套在data.frame中的行
- java - Java 2D数组,无法找到将双重计算存储为元素的方法
- python - 你如何改变python中可以添加到整数的内容?
- python - 这是尝试代理的正确方法吗?