2017-04-06 34 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"; 
}