2012-12-06 50 views
3

鑑於以下棘手的XML:XPath和棘手的嵌套節點

<Type> 
    <ID></ID> 
    <Name></Name> 
    <Child> 
     <Type> 
      <ID></ID> 
      <Name></Name> 
      <Child> 
       <Type> 
        <ID></ID> 
        <Name></Name> 
        <Child> 
         <Type> 
          <ID></ID> 
          <Name></Name> 
          <Child> 
           <Type> 
            <ID></ID> 
            <Name>FIND ME</Name> 
           </Type> 
          </Child> 
         </Type> 
        </Child> 
       </Type> 
      </Child> 
     </Type> 
    </Child> 
</Type> 

是否有可能得到最深的類型的名稱字段?我已經試過結構類似:

//*not(*) 

,但沒有結果..

+0

你可能想看看這個問題:http://stackoverflow.com/questions/11135620/how-to-get-the-most-deeply-nested-element-nodes -using-xpath-implementation-wit – koopajah

+1

可能的重複[你如何找到最深的節點(步驟) - Xpath-php-xml-](http://stackoverflow.com/questions/9890097/how-do-you- find-the-deepest-node-steps-xpath-php-xml) –

+0

是的,它與鏈接中的帖子相同。謝謝! –

回答

4

一本短期和簡單的XPath 1.0表達式

//*[not(../*/*)] 

當評估aga INST提供的XML文檔

<Type> 
    <ID></ID> 
    <Name></Name> 
    <Child> 
     <Type> 
      <ID></ID> 
      <Name></Name> 
      <Child> 
       <Type> 
        <ID></ID> 
        <Name></Name> 
        <Child> 
         <Type> 
          <ID></ID> 
          <Name></Name> 
          <Child> 
           <Type> 
            <ID></ID> 
            <Name>FIND ME</Name> 
           </Type> 
          </Child> 
         </Type> 
        </Child> 
       </Type> 
      </Child> 
     </Type> 
    </Child> 
</Type> 

選擇這兩個元件

<ID/> 
<Name>FIND ME</Name> 

因此,在產生所需的結果的情況下,一個XPath表達式是:

//*[not(../*/*)]/Name 

二,通用的XPath 1.0表達式,選擇具有最大深度的元素時,已知的最大深度不小於給定數量更大:

//*[count(ancestor::*) >= 9] 
    | 
    //*[not(//*[count(ancestor::*) >= 9])] 
        [count(ancestor::*) = 8] 
    | 
    //*[not(//*[count(ancestor::*) >= 8])] 
        [count(ancestor::*) = 7] 
    | 
    //*[not(//*[count(ancestor::*) >= 7])] 
        [count(ancestor::*) = 6] 
    | 
    //*[not(//*[count(ancestor::*) >= 6])] 
        [count(ancestor::*) = 5] 
    | 
    //*[not(//*[count(ancestor::*) >= 5])] 
        [count(ancestor::*) = 4] 
    | 
    //*[not(//*[count(ancestor::*) >= 4])] 
        [count(ancestor::*) = 3] 
    | 
    //*[not(//*[count(ancestor::*) >= 3])] 
        [count(ancestor::*) = 2] 
    | 
    //*[not(//*[count(ancestor::*) >= 2])] 
        [count(ancestor::*) = 1] 

    | 
    /*[not(//*[count(ancestor::*) >= 1])] 

雖然這似乎是一個很長的和笨重,通常XML文檔不超過4-5級深度,並且這種表達實際上是實際的


三,通用的XPath 2.0解決方案

//*[not(*) and count(ancestor::*) = max(//*/count(ancestor::*))] 
1

試試這個XPath:

//Type[not(descendant::Type)]/Name