Вложенный LiNQ в XML - PullRequest
       14

Вложенный LiNQ в XML

0 голосов
/ 02 июня 2009

Я ищу хороший способ сохранить / загрузить следующее. Я хочу сохранить в формате 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()
    {
    }
}

По сути, ErrorList содержит список ошибок верхнего уровня, у каждой ошибки могут быть дочерние элементы. Вывод XML должен выглядеть примерно так:

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

Если бы кто-нибудь мог помочь, это было бы здорово. Спасибо

Ответы [ 2 ]

1 голос
/ 02 июня 2009

Хорошо, я думаю, что вижу, что вы после этого. Попробуйте это:

// 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);
    }        
}
0 голосов
/ 02 июня 2009

Посмотрите на это . Это должно быть то, что вы ищете. Не думал LINQ, но довольно хороший и простой способ вывода XML.

Суть в том, чтобы использовать XmlSerializer .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...