Linq To Xml Сохранение списка вложенных объектов - PullRequest
0 голосов
/ 07 апреля 2011

В настоящее время я загружаю файл XML в список объектов, используя код, подобный этому

    XDocument xmlDoc = XDocument.Load(path);
    List<ImportDefinition> importDefinitions = xmlDoc.Descendants("Root").Select(xElem => (ImportDefinition)xElem).ToList();
    return importDefinitions;

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

public static explicit operator Rules(XElement xElem)
{
    try
    {
        return new Rules()
        {
            FileNameRegEx = (string)xElem.Element("FileNameRegEx"),
            FileExtension = (string)xElem.Element("FileExtension")
        };
    }
    catch (Exception ex)
    {
        return null;
    }

Это прекрасно работает для загрузки XML. Теперь я хочу сохранить этот список объектов обратно в XML после внесения некоторых изменений.

Я надеялся, что что-то подобное сработает

  XElement xml = new XElement("Root",
                             from p in ObjectList
                             select new XElement("File",RootObject
                                 ));
    }
    xml.Save("C:\\temp\\newimport.xml");

Однако, похоже, это выдает

<?xml version="1.0" encoding="utf-8"?>
<Root>
  <File>MyNamespace.RootObject</File>
  <File>MyNamespace.RootObject</File>
</Root>

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

1 Ответ

3 голосов
/ 07 апреля 2011

Ну, во-первых, вы только что показали нам оператор синтаксического анализа из XElement ... но даже в этом случае вы явно явно вызываете это в своем выражении LINQ,Если вам нужен эквивалент при построении XML, вам также нужно будет явно указать:

XElement xml = new XElement("Root",
                            from p in ObjectList
                            select new XElement("File", (XElement) p));

Лично я бы использовал методы вместо операторов - ToXElement () и FromXElement () - я думаю, что это понятнеесюда.ToXElement будет методом экземпляра;FromXElement будет статическим методом.Это шаблон, который я использовал много раз, и он всегда работал нормально.

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