2017-04-06 8 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コードを、使用していますか?誰かが何かをsuggetできますか?

$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

多分私はそれを得ることはできませんが、なぜあなたは単に正規表現を使用しないのですか? – 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が軸です。ここに他の軸があり、あなたの場合は2つ興味深いです: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"; 
}