代码之家  ›  专栏  ›  技术社区  ›  Chris

嵌套的LINQ到XML

  •  0
  • Chris  · 技术社区  · 15 年前

    我正在寻找一种保存/加载以下内容的好方法。 我想保存为XML,理想情况下希望使用LINQ(即帮助我学习LINQ)

    不过,我不知道如何编写嵌套的LINQ。有人能帮忙吗?

        /// <summary>
    /// 
    /// </summary>
    public class ErrorType
    {
        List<ErrorType> _childErrors;
    
        public String Name { get; set; }
        public bool Ignore { get; set; }
    
        public List<ErrorType> ChildErrors { get; protected set; }
    }
    
    /// <summary>
    /// 
    /// </summary>
    public class ErrorList
    {
        public List<ErrorType> ChildErrors { get; protected set; }
    
        public void Save()
        {
        }
    
        public void Load()
        {
        }
    }
    

    本质上,错误列表包含错误的顶级列表,每个错误都可以有子级。 XML输出应该如下所示:

    <ErrorList>
    <ErrorName1 Ignore="false">
    <ChildErrorName1 Ignore="true">
    <ChildErrorName2 Ignore="false" />
    </ChildErrorName1>
    </ErrorName1>
    <ErrorList>
    

    如果有人能帮忙,那就太好了。 谢谢

    2 回复  |  直到 15 年前
        1
  •  1
  •   Jon Skeet    15 年前

    好吧,我想我知道你在找什么了。试试这个:

    // Need to declare in advance to call within the lambda.
    Func<ErrorType, XElement> recursiveGenerator = null;
    recursiveGenerator = error => new XElement
        (error.Name,
         new XAttribute("Ignore", error.Ignore),
         error.ChildErrors.Select(recursiveGenerator));
    
    var errorList = new XElement
        ("ErrorList", errors.ChildErrors.Select(recursiveGenerator));
    

    下面是一个完整的例子:

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Xml.Linq;
    
    public class ErrorType
    {
        public String Name { get; set; }
        public bool Ignore { get; set; }
    
        public List<ErrorType> ChildErrors { get; protected set; }
        public ErrorType()
        {
            ChildErrors = new List<ErrorType>();
        }
    }
    
    public class ErrorList
    {
        public List<ErrorType> ChildErrors { get; protected set; }
        public ErrorList()
        {
            ChildErrors = new List<ErrorType>();
        }
    }
    
    public class Test
    {
        public static void Main()
        {
            var childError2 = new ErrorType { 
                Name = "ChildErrorName2", Ignore=false };
            var childError1 = new ErrorType {
                Name = "ChildErrorName1", Ignore=true,
                ChildErrors = { childError2 }
            };
            var mainError = new ErrorType {
                Name = "ErrorName1", Ignore=true,
                ChildErrors = { childError1 }
            };
            var errorList = new ErrorList { ChildErrors = { mainError } };
    
            // Need to declare in advance to call within the lambda.
            Func<ErrorType, XElement> recursiveGenerator = null;
            recursiveGenerator = error => new XElement
                (error.Name,
                 new XAttribute("Ignore", error.Ignore),
                 error.ChildErrors.Select(recursiveGenerator));
    
            var element = new XElement
                 ("ErrorList", 
                  errorList.ChildErrors.Select(recursiveGenerator);
    
            Console.WriteLine(element);
        }        
    }
    
        2
  •  0
  •   Community Mr_and_Mrs_D    7 年前

    看一看 this .这应该是你想要的。没有Linq的想法,但是输出XML的方式非常好和简单。

    但底线是使用 XmlSerializer .