我有以下部分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>
Run Code Online (Sandbox Code Playgroud)
我需要得到PN N = @ P1的最后一个节点.
样本查询将不胜感激.
提前致谢.
该last()XPath函数可用来找到最后一个节点集.因此,<PN>具有attribyte N值的最后一个节点@P1将是:
//PN[@N='@P1'][position() = last()]
Run Code Online (Sandbox Code Playgroud)
在.NET代码将取决于XML API你使用:XmlDocument,XPathDocument或LINQ到XML( XDocument).(方法XmlReader是加载到三个中的一个然后使用它.)
编辑(基于注释)要返回<F>上一个<PN>带有属性的后代,如上所示,其中xDoc是一个实例XmlDocument:
var foundNode = xDoc.SelectSingleNode("//PN[@N='@P1'][position() = last()]/TM/JB/F");
Run Code Online (Sandbox Code Playgroud)
编辑#2(基于另一个评论):返回最后一个 <PN>,其中每个元素<DT>可以在所有元素中包含多个<DT>元素1<DT>.
使用一些更好的示例XML(见下文)对此进行测试,使用XmlElement.SelectNodes然后迭代返回的节点集显示正在找到正确的节点,它不是第一个,因此不会返回SelectSingleNode.这是线索:last()谓词正在每个//PN[@N='@P1']匹配中应用.只需快速更改优先级即可:
(//PN[@N='@P1'])[last()]
Run Code Online (Sandbox Code Playgroud)
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>
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
5957 次 |
| 最近记录: |