Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/258.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php SimpleXMLElement上的XML xpath_Php_Xml_Xpath - Fatal编程技术网

Php SimpleXMLElement上的XML xpath

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> &

我需要您的帮助,从下面的XML列表中获取从根到叶的所有(完整)路径

<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";
}