我想提供一种在应用程序中保存工作的方法。这是一种项目功能。项目需要序列化为XML。我有DataContractSerializer生成XML,但我需要能够在XML文件中选择一个位置,以便序列化,而不是为自己编写一个完整的文件,因为会有多个项目,我需要能够从Projects XML文件中单独/序列化这些项目。
我想要的XML:
<Projects>
<Project>
<ID>...</ID>
<Name>...</Name>
<LastEdited>...</LastEdited>
...
</Project>
<Project>...</Project>
<Project>...</Project>
</Projects>
然后我会根据Project ID使用Linq to XML序列化和反序列化以导航文档。
有什么建议吗?非常感谢提前。
答案 0 :(得分:1)
找到了一种方法。它有它的故障但是一旦你把所有东西都包括在内它就会很顺利。
生成XML:
DataContractSerializer ser = new DataContractSerializer(typeof(Project));
StringBuilder objectSB = new StringBuilder();
XmlWriter objectWriter = XmlWriter.Create(objectSB);
//I'm using this method in the object I want to serialize (hence the 'this')
ser.WriteObject(objectWriter, this);
objectWriter.Flush();
然后您可以使用以下命令将StringBuilder转换为Linq to XML的XElement:
Xelement xProject = Xelement.Parse(objectSB.ToString());
反序列化:
DataContractSerializer ser = new DataContractSerializer(typeof(Project));
Project project = (CoilProject)ser.ReadObject(xProject.CreateReader());
有几次我使用Linq to XML编辑XML而没有反序列化和重新序列化。由于DataContractSerializer添加的名称空间,这是必要的:
//place this somewhere in your project's namespace
public static class MyExtensions
{
public static IEnumerable<XElement> ElementsAnyNS(this XElement source, string localName)
{
return source.Elements().Where(e => e.Name.LocalName == localName);
}
public static XElement ElementAnyNS(this XElement source, string localName)
{
return source.Elements().Where(e => e.Name.LocalName == localName).Select(e => e).Single();
}
}
这些扩展方法允许您从序列化对象中选择一个或多个元素,而无需担心命名空间。我在Pavel Minaev's answer上Ignore namespaces in LINQ to XML修改了这些扩展方法。