当有多个时,XPathSelectElement选择第二个

时间:2012-11-27 09:56:43

标签: c# .net xml xpath

嗨不确定是否可以这样做,但我知道有人会知道:)

使用

XElement oNodeEquip = xmlDoc.XPathSelectElement("//ItemAry/Item/Equip");

我如何从下面的第二个中选择装备:

<TestInfo>
  <ItemAry>
    <Item>
      <testData>ABC</testData>
    </Item>
    <Item>
      <testData>XYZ</testData>
      <Equip>xxx</Equip>
    </Item>
  </ItemAry>
</TestInfo>

总是至少有2 <Item>,而我希望值来自的节点将始终位于第二个<Item>

这是一个使用.Net 4.0的WPF应用程序

4 个答案:

答案 0 :(得分:3)

试试这个XPath表达式:

//ItemAry/Item[2]/Equip

它仅考虑第二个<Item>元素。

答案 1 :(得分:1)

您可以使用Linq to Xml轻松完成:

XDocument xdoc = XDocument.Load(path_to_xml);
var second = (string)xdoc.Descendants("Item").Skip(1).Element("Equip");

答案 2 :(得分:1)

使用

(/*/ItemAry/Item)[2]/Equip

当前选择的答案可能会产生意外结果,具体取决于手头的特定XML文档

//ItemAry/Item[2]/Equip

选择所有 Equip元素的Item子元素,这些元素是其Item父级的第二个ItemAry子元素。

因此,如果源XML文档是

<TestInfo>
  <ItemAry>
    <Item>
      <testData>ABC</testData>
    </Item>
    <Item>
      <testData>XYZ</testData>
      <Equip>xxx</Equip>
    </Item>
  </ItemAry>
  <ItemAry>
    <Item>
      <testData>DEF</testData>
    </Item>
    <Item>
      <testData>TUW</testData>
      <Equip>yyy</Equip>
    </Item>
  </ItemAry>
</TestInfo>

以上可能错误的表达式会选择两个元素

<Equip>xxx</Equip>
<Equip>yyy</Equip>

此回答中提供的正确表达

(/*/ItemAry/Item)[2]/Equip

仅选择:

<Equip>xxx</Equip>

答案 3 :(得分:0)

如果您确定节点的位置,可以在XPath中使用position() function

XElement oNodeEquip = xmlDoc.XPathSelectElement("//ItemAry/Item[position()=2]/Equip");