如何找出我目前使用 XPATh 的事物的第 N 个节点

本文关键字:节点 XPATh 何找出 目前 | 更新日期: 2023-09-27 18:17:22

Ok. 我在 xml 文档中有一个属性,我知道该属性将多次出现。 使用 C# 我遍历具有此属性的所有节点。 我知道如何使用 xpath 计算元素的出现次数......

count("//x/y@b")

等等。
但是有没有办法让我得到我所在的节点的第 n 个值......例如

<?xml version="1.0"?>
<x>
   <y/>
   <y/>
   <y/>
</x>

假设我使用 c# 以编程方式循环遍历它。 假设我在第二个元素上。 有什么方法可以使用 xpath 来确定我在第二个节点上? 我想我只是想在迭代中找到自己的位置。 有什么想法吗? 目前正在搜索互联网。 如果我发现它,我一定会让你知道。

谢谢。

更新:似乎无法让我的东西工作还行。 我想我会更新我的问题。 我似乎无法让你的任何建议起作用......

<Template>
 <TemplateData>
  <ACOData>
   <POPULATION_PATIENT_ID>6161</POPULATION_PATIENT_ID>
   <PATIENT_ID>4329</PATIENT_ID>
  </ACOData>
  <ACOData>
   <POPULATION_PATIENT_ID>5561</POPULATION_PATIENT_ID>
   <PATIENT_ID>4327</PATIENT_ID>
  </ACOData>
  <ACOData>
   <POPULATION_PATIENT_ID>6160</POPULATION_PATIENT_ID>
   <PATIENT_ID>4321</PATIENT_ID>
  </ACOData>
  <ACOData>
   <POPULATION_PATIENT_ID>5561</POPULATION_PATIENT_ID>
   <PATIENT_ID>4320</PATIENT_ID>
  </ACOData>

这就是我正在使用的 XML。 但我似乎无法得到正确的计数。 我总是想零?

encounter = Int32.Parse((patElm.CreateNavigator().Evaluate("count(/Template/TemplateData/ACOData/POPULATION_PATIENT_ID[.='" + populationPatID + "']/preceding-sibling::ACOData/POPULATION_PATIENT_ID[.='"+populationPatID+"'])")).ToString());

以上是我试图用来获取正确值的代码......注意我的计数函数

count(/Template/TemplateData/ACOData/POPULATION_PATIENT_ID[.='" + populationPatID + "']/preceding-sibling::ACOData/POPULATION_PATIENT_ID[.='"+populationPatID+"'])"

如何找出我目前使用 XPATh 的事物的第 N 个节点

要获取文档中的第二个此类元素,请使用:

(//x/y[@b])[2]

假设你想走另一条路。也就是说,您有一个这些节点,并且想知道它的整体位置。通常,对于任何表达式<expr>以下情况都是正确的:

$n = count((<expr>)[$n]/preceding::*[count(.|<expr>)=count(<expr>)])

也就是说,通过计算该表达式也选择的所有前面元素,可以找到<expr>选择的第 N 个元素的位置。使用类似的技术,我们可以在该表达式选择的所有节点集中找到某个节点的位置,该节点将由更通用的表达式选择

例如,假设我们有以下文档:

<x>
    <y b="true"/>
    <y b="true"/>
    <y/>
    <y/>
    <x><y b="true"/><y/><y b="true">77</y></x>
    <y/>
    <y/>
</x>

我们想知道节点在文档中/*/*/y[.='77']的位置 //x/y[@b] 选择的所有节点中的位置。然后使用以下表达式:

count(/*/*/y[.='77']/preceding::*[count(.|//x/y[@b])=count(//x/y[@b])]) + 1

更具体的一次性解决方案如下所示:

count(/*/*/y[.='77']/preceding::y[parent::x and @b]) + 1

结果(在两种情况下(:

4

注意:假设上面的/*/*/y[.='77'](<expr>)[$n]实际上选择了文档中的某个节点。否则,由于计数结果加 1,结果将是错误的1。因此,在上下文节点上工作或保证初始表达式选择节点时,此方法可能最有用。(当然,也可以使用初始错误检查。

假设我使用 c# 以编程方式循环遍历它。和 假设我在第二个元素上。有没有办法使用 xpath 我可以弄清楚我在第二个节点上?

正如您所说,假设当前(初始上下文(节点/x/y[2],并且您想查看它的"位置"是什么。

计算此 XPath 表达式(关闭当前节点(:

count(preceding-sibling::y) + 1

您可以使用位置函数

x/y[position() = 3]