2017-04-06 40 views
-2

我需要您的帮助才能从根目录下的所有(完整)路径列表下的XML获取。SimpleXMLElement上的XML xpath

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

我想类似:

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

使用后续的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>";   

     } 
    } 
} 

非常感谢 啤酒

+0

也许我不明白,但是:为什么你不使用RegExp? – Boern

+0

我想调查我们使用XML xpath导航的可能性...我的需求是获得以下列表 1 - 10 - 10 - 19 1 - 20 - 20 - 21 2 - 100 - 100 - 50 2 - 21 - 120 - 33 3 - 200 - 300 - 99 3 - 44 - 55 - 64 – user6167852

回答

0

首先,你应该简化您目前的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>";   

     } 
    } 
} 

这使用一些Xpath默认值。像'V'这样的表达式的长形式是'child :: V'。 child是轴。以下是其他坐标轴,其中两个坐标是有趣的:descendant(短//)和ancestor

所以首先让我们遍历文档中的所有A节点。

foreach ($test1->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"; 
}