首页 / .NET / 正文

[LINQ]C#程序开发中如何使用LINQ读取XML文件

2453 发布于: 2018-01-29 读完约需7分钟

问题描述

比如当前有如下的xml文件:

<root>
    <level1 name="A">
        <level2 name="A1" />
        <level2 name="A2" />
    </level1>
    <level1 name="B">
        <level2 name="B1" />
        <level2 name="B2" />
    </level1>
    <level1 name="C" />
</root>

在C#程序开发中,如何使用LINQ实现如下结果的输出:

A
  A1
  A2
B
  B1
  B2
C

方案一

void Main()
{
    StringBuilder result = new StringBuilder();

    //加载XML文件
    XDocument xdoc = XDocument.Load("data.xml");

    //执行Query查询
    var lv1s = from lv1 in xdoc.Descendants("level1")
               select new {
                   Header = lv1.Attribute("name").Value,
                   Children = lv1.Descendants("level2")
               };

    //循环输出查询结果
    foreach (var lv1 in lv1s){
            result.AppendLine(lv1.Header);
            foreach(var lv2 in lv1.Children)
                 result.AppendLine("     " + lv2.Attribute("name").Value);
    }

    Console.WriteLine(result);
}

方案二

void Main()
{
    XElement rootElement = XElement.Load(@"c:\events\test.xml");

    Console.WriteLine(GetOutline(0, rootElement));  
}

private string GetOutline(int indentLevel, XElement element)
{
    StringBuilder result = new StringBuilder();

    if (element.Attribute("name") != null)
    {
        result = result.AppendLine(new string(' ', indentLevel * 2) + element.Attribute("name").Value);
    }

    foreach (XElement childElement in element.Elements())
    {
        result.Append(GetOutline(indentLevel + 1, childElement));
    }

    return result.ToString();
}

方案二

foreach (XElement level1Element in XElement.Load("data.xml").Elements("level1"))
{
    result.AppendLine(level1Element.Attribute("name").Value);

    foreach (XElement level2Element in level1Element.Elements("level2"))
    {
        result.AppendLine("  " + level2Element.Attribute("name").Value);
    }
}

方案三

XDocument xdoc = XDocument.Load("data.xml");
var lv1s = xdoc.Root.Descendants("level1");
var lvs = lv1s.SelectMany(l=>
     new string[]{ l.Attribute("name").Value }
     .Union(
         l.Descendants("level2")
         .Select(l2=>"   " + l2.Attribute("name").Value)
      )
    );
foreach (var lv in lvs)
{
   result.AppendLine(lv);
}

注:此方案需要使用.Root

版权声明:本作品系原创,版权归码友网所有,如未经许可,禁止任何形式转载,违者必究。

上一篇: [.NET/C#]C#程序开发中删除文件夹中的所有文件及子文件夹有哪些方法呢?

下一篇: [LINQ].NET/C#程序开发中如何使用LINQ进行多字段(属性)排序?

本文永久链接码友网 » [LINQ]C#程序开发中如何使用LINQ读取XML文件

分享扩散:

发表评论

登录用户才能发表评论, 请 登 录 或者 注册