每个分支节点获取3个分支

Get 3 branch of each branching node

我想获取分支节点的第三个节点。例子

<rows>
    <row>
        <cell>a</cell>
        <cell>b</cell>
        <cell>c</cell>
        <cell>d</cell>
        <cell>e</cell>
        <cell>f</cell></row>
    <row>
        <cell>aa</cell>
        <cell>bb</cell>
        <cell>cc</cell>
        <cell>dd</cell>
        <cell>ee</cell>
        <cell>ff</cell>
    </row>
......
</rows>

我基本上是想把项目c和cc等等弄出来。基本上是行中的第三个单元格元素。这就是我所拥有的。但是我想要的是项目的值而不是 xml.

var Study = XDocument.Load(XmlReader.Create(studyStream));

var rows = Study.Descendants("row");
foreach (var item in rows)
{
    var cells = item.Descendants("cell");
    string id = null;
    foreach (var items in cells)
    {
        id = items.Parent.FirstNode.NextNode.NextNode.ToString();
    }

    Console.WriteLine(id);
}

Console.Read();

有没有办法正确地做到这一点?谢谢大家的帮助。

凯文

嗯,你可以这样做:

var xdoc = XDocument.Load(@"your_file.xml");
foreach (var children in xdoc.XPathSelectElements("rows/row"))
{
    var thirdChild = children.Elements().Skip(2).Take(1).FirstOrDefault();
    if (thirdChild != null)
        Console.WriteLine(thirdChild.Value);
}

这里我们首先选择 /row 元素,然后为每个这样的行选择第三个子元素的值。

这个有值集合也可以不用foreach循环得到,只能通过linq查询如:

var values = xdoc.XPathSelectElements("rows/row")
                 .Select(row => row.Elements().Skip(2).Take(1).First().Value);

你也可以这样做

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Xml;
using System.Xml.Linq;

namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {
            string input =
                "<rows>" +
                    "<row>" +
                        "<cell>a</cell>" +
                        "<cell>b</cell>" +
                        "<cell>c</cell>" +
                        "<cell>d</cell>" +
                        "<cell>e</cell>" +
                        "<cell>f</cell></row>" +
                    "<row>" +
                        "<cell>aa</cell>" +
                        "<cell>bb</cell>" +
                        "<cell>cc</cell>" +
                        "<cell>dd</cell>" +
                        "<cell>ee</cell>" +
                        "<cell>ff</cell>" +
                    "</row>" +
                "</rows>";

            XElement rows = XElement.Parse(input);

            var results = rows.Descendants("row").Select(x => new
            {
                cells = x.Elements("cell").Select(y => y.Value).ToList()
            }).ToList();

            List<string> thirdCells =  results.Select(x => x.cells[2]).ToList();

        }
    }
}
​