如何找出我目前正在使用XPATh的东西的第N个节点

时间:2011-12-08 22:37:27

标签: c# xpath

确定。我在xml文档中有一个属性,我知道它会不止一次出现。使用C#I循环遍历具有此属性的所有节点。我知道如何使用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+"'])"

3 个答案:

答案 0 :(得分:3)

要在文档中使用第二个这样的元素:

(//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。因此,在处理上下文节点或确保初始表达式选择节点时,此方法可能最有用。 (当然,也可以使用初始错误检查。)

答案 1 :(得分:1)

  

假设我正在使用c#以编程方式循环。和   让我说我是第二个元素。有没有办法使用xpath   我可以弄明白我在第二个节点上?

假设,正如你所说,当前(初始上下文)节点是/x/y[2],你想知道它的“位置”是什么。

评估此XPath表达式(关闭当前节点):

count(preceding-sibling::y) + 1

答案 2 :(得分:0)

您可以使用position功能

x/y[position() = 3]