Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/256.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在C#中使用XPath检索最后一个节点?_C#_Xml_Xpath - Fatal编程技术网

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

如何在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&

我有以下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>
                    <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函数查找节点集的最后一个。因此,attribyte
N
具有值
@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。。。我想这就是了。