如何在C#中使用XPath检索最后一个节点?
我有以下xml文件的一部分如何在C#中使用XPath检索最后一个节点?,c#,xml,xpath,C#,Xml,Xpath,我有以下xml文件的一部分 <UN N="@U1"> <DT N="24/06/2011"> <PN N="@P1"> <TM N="02:24:11"> <JB T="GP"> <A>notepad</A> <Z>Notepad</Z&
<UN N="@U1">
<DT N="24/06/2011">
<PN N="@P1">
<TM N="02:24:11">
<JB T="GP">
<A>notepad</A>
<Z>Notepad</Z>
<N>Untitled - Notepad</N>
<J>1;0;1;1;0;0</J>
<C>0.00500;0.09500;0.03500</C>
<S>1;0;1;1</S>
<P>0;0</P>
<F>0</F>
</JB>
</TM>
</PN>
</DT>
<DT N="23/06/2011">
<PN N="@P1">
<TM N="02:38:49">
<JB T="PAGP">
<A>notepad</A>
<Z>Notepad</Z>
<N>Untitled - Notepad</N>
<J>1;1;1;1;0;1</J>
<C>0.00500;0.09500;0.03500</C>
<S>1;1;0;0</S>
<P>1;1</P>
<F>0</F>
</JB>
</TM>
</PN>
</DT>
.....
.....
</UN>
便条簿
便条簿
无标题记事本
1.0;1.1.0;0
0.00500;0.09500;0.03500
1.0;1.1.
0;0
0
便条簿
便条簿
无标题记事本
1.1.1.1.0;1.
0.00500;0.09500;0.03500
1.1.0;0
一,;1
0
.....
.....
我需要得到PN N=@P1的最后一个节点
样品查询将不胜感激
提前感谢。XPath操作:
"/UN/DT[PN/@N='@p1'][last()]"
将返回最后一个DT节点,PN=@p1
可以使用last()
XPath函数查找节点集的最后一个。因此,attribyteN
具有值@P1
的最后一个
节点将是:
//PN[@N='@P1'][position()=last()]
NET代码将取决于您使用的XML API:,或LINQ to XML()。(使用的方法是加载到三个选项中的一个,然后使用该选项。)
编辑(基于注释)以返回最后一个
的
子体,其属性如上所述,其中xDoc
是XmlDocument
的实例:
var foundNode=xDoc.SelectSingleNode(//PN[@N='@P1'][position()=last()]/TM/JB/F”);
编辑#2(基于另一个注释):返回最后一个
,其中每个
可以包含跨所有
元素的多个
元素1
使用一些更好的示例XML(见下文)对此进行测试,然后使用返回的节点集进行迭代,结果表明找到了正确的节点,它不是第一个,因此SelectSingleNode
不会返回。这就是线索:在每个//PN[@N='@P1']
匹配中都应用了last()
谓词。所需要的只是迅速改变优先顺序:
(//PN[@N='@P1'])[last()]
1为便于将来参考,如果可能有多个元素,则在示例中至少显示两个元素,否则读者将仅假设单个实例。同时去掉所有不需要的节点(如子节点): 我用于测试的示例XML(添加了x属性,以便于在测试时识别所选元素):
您正在查找
或
节点吗?谢谢,它工作得非常好。如果要从返回的节点检索TM/JB/F的最后一个节点,该怎么办。我正在使用XmlDocument类。我发现自己。它将是这样的:“@”//PN[@N='@P1'][position()=last()]/TM[position()=last()]/JB/F”;“不管怎样,谢谢你的初始XPath。很抱歉迟了评论。它返回第一个DT的最后一个PN节点,但我需要最后一个节点,与.xml文件中的DT无关。注意:.xml文件可以包含任意数量的DT,而在DT中它可以包含许多数量的PN。@Syed:我稍后会查看,但是更好的xml示例会有所帮助(请更新Q)。删除细节(如与Q无关的子节点)。@Syed:Updated。。。我想这就是了。