如何在C#中使用XPath检索最后一个节点?

前端之家收集整理的这篇文章主要介绍了如何在C#中使用XPath检索最后一个节点?前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我有以下部分xml文件.
  1. <UN N="@U1">
  2. <DT N="24/06/2011">
  3. <PN N="@P1">
  4. <TM N="02:24:11">
  5. <JB T="GP">
  6. <A>notepad</A>
  7. <Z>Notepad</Z>
  8. <N>Untitled - Notepad</N>
  9. <J>1;0;1;1;0;0</J>
  10. <C>0.00500;0.09500;0.03500</C>
  11. <S>1;0;1;1</S>
  12. <P>0;0</P>
  13. <F>0</F>
  14. </JB>
  15. </TM>
  16. </PN>
  17. </DT>
  18.  
  19. <DT N="23/06/2011">
  20. <PN N="@P1">
  21. <TM N="02:38:49">
  22. <JB T="PAGP">
  23. <A>notepad</A>
  24. <Z>Notepad</Z>
  25. <N>Untitled - Notepad</N>
  26. <J>1;1;1;1;0;1</J>
  27. <C>0.00500;0.09500;0.03500</C>
  28. <S>1;1;0;0</S>
  29. <P>1;1</P>
  30. <F>0</F>
  31. </JB>
  32. </TM>
  33. </PN>
  34. </DT>
  35.  
  36. .....
  37. .....
  38.  
  39. </UN>

我需要得到PN N = @ P1的最后一个节点.

样本查询将不胜感激.

提前致谢.

解决方法

last()XPath函数可用于查找节点集的最后一个.所以最后的< PN>具有值为@ P1的attribyte N的节点将是:
  1. //PN[@N='@P1'][position() = last()]

.NET代码将取决于您使用的XML API:XmlDocument,XPathDocument或LINQ to XML(XDocument). (XmlReader方法是加载到三个中的一个,然后使用它.)

编辑(根据评论)返回< F>最后一个< PN>的后代使用上面的属性,其中xDoc是XmlDocument的一个实例:

  1. var foundNode = xDoc.SelectSingleNode("//PN[@N='@P1'][position() = last()]/TM/JB/F");

编辑#2(基于另一个评论):要返回最后一个< PN>其中每个< DT>可以包含多个< DT>所有< DT>中的elements1元素.

使用一些更好的示例XML(见下文)测试它,使用XmlElement.SelectNodes然后迭代返回的节点集显示正在找到正确的节点,它不是第一个,因此不会被SelectSingleNode返回.这是线索:在每个// [@N =’@ P1′]匹配中应用last()谓词.只需快速更改优先级即可:

  1. (//PN[@N='@P1'])[last()]

1为了将来参考,如果可能有多个元素,则在样本中至少显示两个,否则读者将只假设单个实例.同时删除不需要的所有节点(如子节点):

我用于测试的示例XML(添加了x属性,以便在测试时轻松识别所选元素):

  1. <UN N='@U1'>
  2. <DT N='24/06/2011'>
  3. <PN N='@P1' x='#1'/>
  4. <PN N='@P1' x='#2'/>
  5. <PN N='@P2' x='#3'/>
  6. </DT>
  7.  
  8. <DT N='24/06/2011'>
  9. <PN N='@P1' x='#4'/>
  10. <PN N='@P1' x='#5'/>
  11. <PN N='@P2' x='#6'/>
  12. </DT>
  13.  
  14. <DT N='24/06/2011'>
  15. <PN N='@P3' x='#7'/>
  16. <PN N='@P4' x='#8'/>
  17. <PN N='@P5' x='#9'/>
  18. </DT>
  19. </UN>

猜你在找的C#相关文章