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

本文关键字:XPath 检索 最后一个 节点 | 更新日期: 2023-09-27 18:06:29

我有以下部分的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>

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

示例查询将被欣赏。

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

XPath操作:

"/UN/DT[PN/@N='@p1'][last()]"

将返回PN=@p1 .

所对应的最后一个DT节点

last() XPath函数可用于查找节点集的最后一个。因此,属性值N具有值@P1的最后一个<PN>节点将是:

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

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

编辑(基于注释)返回具有上述属性的最后一个<PN><F>后代,其中xDocXmlDocument的实例:

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

编辑#2(基于另一个注释):返回最后一个 <PN>,其中每个<DT>可以包含多个<DT>元素1贯穿所有<DT>元素。

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

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

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

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

<UN N='@U1'>
  <DT N='24/06/2011'>
    <PN N='@P1' x='#1'/>
    <PN N='@P1' x='#2'/>
    <PN N='@P2' x='#3'/>
  </DT>
  <DT N='24/06/2011'>
    <PN N='@P1' x='#4'/>
    <PN N='@P1' x='#5'/>
    <PN N='@P2' x='#6'/>
  </DT>
  <DT N='24/06/2011'>
    <PN N='@P3' x='#7'/>
    <PN N='@P4' x='#8'/>
    <PN N='@P5' x='#9'/>
  </DT>
</UN>