【问题标题】:Get 3 branch of each branching node获取每个分支节点的 3 个分支
【发布时间】:2015-09-25 10:34:22
【问题描述】:

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

<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();

有没有办法正确地做到这一点?感谢您的所有帮助。

凯文

【问题讨论】:

    标签: c# xml linq nodes descendant


    【解决方案1】:

    好吧,你可以这样做:

    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);
    

    【讨论】:

    • 我正在尝试从流中加载。 var Study = XDocument.Load(XmlReader.Create(studyStream));我没有 XPathSelectElements
    • XDocument 的数据源是什么并不重要。它可以从文件、流等中加载。 XPathSelectElementsSystem.Xml.XPath 命名空间中定义的扩展方法,请确保您正在使用它。
    • @Andy - 你也可以使用.XPathSelectElements("rows/row/cell[3]"),无需.Skip(2).Take(1).First()
    【解决方案2】:

    你也可以这样做

    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();
    
            }
        }
    }
    ​
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-11-03
      • 2019-08-12
      • 1970-01-01
      • 1970-01-01
      • 2018-07-03
      • 2017-12-23
      • 1970-01-01
      相关资源
      最近更新 更多