Загрузить вложенный XML с помощью LiNQ - PullRequest
1 голос
/ 02 июня 2009

Я недавно задал вопрос о том, как сохранить список с вложенными элементами в XML , но сейчас я пытаюсь написать загрузчик для класса и столкнулся с проблемами.

Я пытаюсь отменить ответ (спасибо Джон ).

Я считаю, что мой основной запрос LINQ в порядке, это рекурсия, с которой я борюсь. Вот мой код (для ясности я разместил весь CPP как есть)

   /// <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; }

    /// <summary>
    /// 
    /// </summary>
    /// <param name="xml"></param>
    public void FilterErrors(XElement xml)
    {
        //Convert to ErrorList
        //Write back out to XML but not writing out anything with errors
        //Send XML on its way
    }

    /// <summary>
    /// 
    /// </summary>
    /// <param name="el"></param>
    /// <returns></returns>
    private XElement ErrorListToXml(ErrorList el)
    {
        // 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",
                    ChildErrors.Select(recursiveGenerator));

        Console.WriteLine(element);

        return element;
    }

    /// <summary>
    /// 
    /// </summary>
    /// <param name="xd"></param>
    /// <returns></returns>
    private ErrorList FromXmlToErrorList(XElement xd)
    {
        //Prepare lambda
        Func<ErrorType, XElement> recursiveGenerator = null;
        recursiveGenerator = error => new List<ErrorType>
            (error.Name,
             new XAttribute("Ignore", error.Ignore),
             error.ChildErrors.Select(recursiveGenerator));

        List<ErrorType> typeList = (from error in xd.Descendants()
                        select new ErrorType
                        {
                            Name = error.Value,
                            Ignore = bool.Parse(error.Attribute("Ignore").Value),
                            ChildErrors= error.Elements().Select()
                        }).ToList<ErrorType>();

        ErrorList el = new ErrorList();
        el.ChildErrors = typeList;
        return el;
    }

    /// <summary>
    /// 
    /// </summary>
    public void Save()
    {
        XElement xml = ErrorListToXml(this);
        xml.Save("errorlist.xml");
    }

    public void Load()
    {

    }
}

Thankyou

Ответы [ 2 ]

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

У меня это работает с чем-то вроде:

    XDocument doc = XDocument.Parse(xml);

    Func<XElement, ErrorType> nodeReader = null;
    nodeReader = el => new ErrorType(
        el.Elements().Select(nodeReader)) {
        Name = el.Name.LocalName,
        Ignore = (bool)el.Attribute("Ignore"),
    };

    ErrorList list = new ErrorList(
        doc.Root.Elements().Select(nodeReader));

Добавив подходящих конструкторов:

public ErrorType(IEnumerable<ErrorType> children) {
    ChildErrors = new List<ErrorType>(children);
}
public ErrorType() { ChildErrors = new List<ErrorType>(); }

public ErrorType(IEnumerable<ErrorType> children) {
    ChildErrors = new List<ErrorType>(children);
}
public ErrorType() { ChildErrors = new List<ErrorType>(); }

любое использование?

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

Хорошо, я не пробовал это (и сейчас у меня нет времени), но я думаю, что это должно сработать ...

public class ErrorType
{
    List<ErrorType> _childErrors;

    public String Name { get; set; }
    public bool Ignore { get; set; }

    public List<ErrorType> ChildErrors { get; protected set; }

    public static ErrorType Parse(XElement element)
    {
        return new ErrorType
        {
            Name = element.Name.LocalName,
            Ignore = (bool) element.Attribute("Ignore"),
            ChildErrors = element.Elements()
                                 .Select(x => Parse(x))
                                 .ToList()
        };
    }
}

public class ErrorList
{
    public List<ErrorType> ChildErrors { get; protected set; }

    public static ErrorList Parse(XElement element)
    {
        return new ErrorList { ChildErrors = element.Elements()
                                 .Select(x => ErrorType.Parse(x))
                                 .ToList() };
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...