Php SimpleXMLElement上的XML xpath
我需要您的帮助,从下面的XML列表中获取从根到叶的所有(完整)路径Php SimpleXMLElement上的XML xpath,php,xml,xpath,Php,Xml,Xpath,我需要您的帮助,从下面的XML列表中获取从根到叶的所有(完整)路径 <List> <V ID="1"> <F> <N>10</N> <M>10</M> <A> <IDX>19</IDX> </A> &
<List>
<V ID="1">
<F>
<N>10</N>
<M>10</M>
<A>
<IDX>19</IDX>
</A>
</F>
<F>
<N>20</N>
<M>20</M>
<A>
<IDX>21</IDX>
</A>
</F>
</V>
<V ID="2">
<F>
<N>100</N>
<M>100</M>
<A>
<IDX>50</IDX>
</A>
</F>
<F>
<N>21</N>
<M>120</M>
<A>
<IDX>33</IDX>
</A>
</F>
</V>
<V ID="3">
<F>
<N>200</N>
<M>300</M>
<A>
<IDX>99</IDX>
</A>
</F>
<F>
<N>44</N>
<M>55</M>
<A>
<IDX>64</IDX>
</A>
</F>
</V>
</List>
10
10
19
20
20
21
100
100
50
21
120
33
200
300
99
44
55
64
我想要类似的:
<V ID="1"><F><N>10</N><M>10</M><A><IDX>19</IDX>
<V ID="1"><F><N>20</N><M>20</M><A><IDX>21</IDX>
<V ID="2"><F><N>100</N><M>100</M><A><IDX>50</IDX>
<V ID="2"><F><N>21</N><M>120</M><A><IDX>33</IDX>
<V ID="3"><F><N>200</N><M>300</M><A><IDX>99</IDX>
<V ID="3"><F><N>44</N><M>55</M><A><IDX>64</IDX>
101019
202021
10010050
2112033
20030099
445564
使用下面的PHP代码,我没有得到我需要的,哪里错了?有人能买点什么吗
$test1 = new SimpleXMLElement($testq);
foreach ($test1->xpath('//V') as $value) {
echo $value["ID"]." - ";
foreach ($test1->xpath('//V[@ID="'.$value["ID"].'"]/F') as $valueF) {
echo $valueF->N." - ";
echo $valueF->M." - ";
foreach ($test1->xpath('//V[@ID="'.$value["ID"].'"]/F/A') as $valueA) {
echo $valueA->IDX." - <BR>";
}
}
}
$test1=新的simplexmlement($testq);
foreach($test1->xpath('//V')作为$value){
echo$value[“ID”]。“-”;
foreach($test1->xpath('//V[@ID=“”。$value[“ID”].“]/F”)作为$valueF){
echo$valueF->N.“-”;
回声$valueF->M.“-”;
foreach($test1->xpath('//V[@ID=“”。$value[“ID”].“]/F/A”)作为$valueA){
echo$valueA->IDX。“-
”;
}
}
}
非常感谢
Ale首先,应该简化当前的Xpath表达式。表达式开头的斜杠使它们将文档本身用作上下文,而不是当前节点。您可以仅通过标记名来减少它们:
$test1 = new SimpleXMLElement($testq);
foreach ($test1->xpath('V') as $valueV) {
echo $valueV["ID"]." - ";
foreach ($valueV->xpath('F') as $valueF) {
echo $valueF->N." - ";
echo $valueF->M." - ";
foreach ($valueF->xpath('A') as $valueA) {
echo $valueA->IDX." - <BR>";
}
}
}
现在,对于这些节点中的每一个,您将获取祖先节点,迭代它们并根据节点输出数据
foreach ($test1->xpath('.//A') as $valueA) {
foreach ($valueA->xpath('ancestor::*') as $ancestor) {
// change that to handle the different ancestor nodes
echo $ancestor->getName(), ' - ';
}
echo $valueA->IDX, "\n";
}
也许我不明白,但是:为什么不使用RegExp呢?我想研究一下XML xpath导航的可能性。。。我的愿望是得到以下列表1-10-10-191-20-20-212-100-100-502-21-120-333-200-300-993-44-55-64
foreach ($test1->xpath('.//A') as $valueA) {
foreach ($valueA->xpath('ancestor::*') as $ancestor) {
// change that to handle the different ancestor nodes
echo $ancestor->getName(), ' - ';
}
echo $valueA->IDX, "\n";
}