2012-12-06 106 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