根据父元素属性选择第n个子元素

时间:2014-02-19 22:16:36

标签: c# xml linq linq-to-xml

使用Linq to XML来查询这个不那么热门的xml文档时,我遇到了一些问题。

架构的一个例子是这样的。

<Data>
    <Row Oper="" Val="THIS">
       <Col Oper="" Val="">
           <Out Val="0"/>
           <Out Val=""/>
           <Out Val="16600"/>
           <Out Val="10000"/>
       </Col>
    </Row>
    <Row Oper="" Val="THAT">
        <Out Val=...">
        ....
    </Row>
</Data>

基本上;我需要根据Row Val匹配主元素,然后根据任意数字得到第n个“Val”。

澄清;我必须匹配“This”并得到第三个孩子的行。我该怎么做呢?

预期输出:“16600”

这是我正在看的内容(我不知道如何在linq中选择第n个孩子)

var query = (from nt in ntd.Descendants("Data").Elements("Out").Skip(1)
             where nt.Element.Attribute("Val").Value == "this"
             select nt.[nth child of row somehow].Attribute("Val").Value)

请注意:我不允许更改XML文档结构。

1 个答案:

答案 0 :(得分:2)

.ElementAt(3) .ElementAt(2)为您提供集合中的第三个元素 - 它是基于0的索引...

您的示例XML与您显示的查询不完全匹配,因此我决定遵循架构,而不是查询:

var query = from r in ntd.Root.Elements("Row")
            where (string)r.Attribute("Val") == "THIS"
            select (string)r.Element("Col").Elements("Out").ElementAt(2).Attribute("Val")