Linq To Xml保存嵌套对象列表

时间:2011-04-07 08:59:53

标签: c# linq-to-xml

我目前使用类似

的代码将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 个答案:

答案 0 :(得分:3)

嗯,有一件事你只向我们展示了从解析一个XElement的操作符......但即便如此,你显然明确在你的中调用它LINQ表达式。如果您在构建XML时需要等效项,那么您也需要明确:

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

就个人而言,我会使用方法而不是运算符 - ToXElement()和FromXElement() - 我认为这样更清晰。 ToXElement将是一个实例方法; FromXElement将是一种静态方法。这是我多次使用过的模式,它总是很好用。