我有一个非常大、复杂的 XML 文件,我希望将每个元素值提取到我已经创建的对象中。我已经尝试过 WCF DataContractSerializer 和普通 XmlSerializer ,它们都非常有问题。
除了使用上述方法解析我的 XML 并分配给对象之外,有人可以推荐最简单的方法来实现上述目标吗?
我正在考虑只使用 XDocument。
我的最终目标是从对象中获取值并序列化为新的 XML。
这是我原来的帖子 XML 反序列化到对象错误
我有一个非常大、复杂的 XML 文件,我希望将每个元素值提取到我已经创建的对象中。我已经尝试过 WCF DataContractSerializer 和普通 XmlSerializer ,它们都非常有问题。
除了使用上述方法解析我的 XML 并分配给对象之外,有人可以推荐最简单的方法来实现上述目标吗?
我正在考虑只使用 XDocument。
我的最终目标是从对象中获取值并序列化为新的 XML。
这是我原来的帖子 XML 反序列化到对象错误
我通常分两步使用Microsoft的 XML Schema Definition Tool (XSD.EXE) 来生成可以从任意 XML 文档反序列化的类:
第1步:
xsd file.xml [/outputdir:directory]
生成与您的 XML 文件对应的 XSD 文件
第2步:
xsd file.xsd /classes [/namespace:namespace] [/outputdir:directory]
使用在步骤 1 中创建的模式生成可以反序列化的类。
从那里您可以按原样使用对象,也可以将对象属性映射到类的属性。
DataContractSerializer 和 XmlSerializer 只能将 XML 水合到您已经拥有的对象中。即,它们仅在您从 X 类型的对象开始,将其序列化,然后将其反序列化回 X 类型时才有效。通常,如果您正在使用发布数据合约的服务,或者您是序列化的人,则可以使用它们自己的数据。请注意,我说它们序列化整个对象。这不仅仅是数据,还包括数据适合的结构和类型。
由于它显然不是一个序列化对象,因此您在构建自己的对象并使用 XDocument 将其分开的过程中处于正确的轨道上。
使用XmlReader
或XmlTextReader
http://msdn.microsoft.com/en-us/library/system.xml.xmlreader.aspx
http://msdn.microsoft.com/en-us/library/system.xml.xmltextreader.aspx
XmlReader 或 XmlTextReader 不会将整个 XML 加载到内存中,因此解析如此大的 XML 文件会很有帮助。
我一直在使用 XmlSerializer 类以及 System.Xml.Serialization 命名空间中的属性和类方面取得了巨大的成功。
当我有复杂的 XML 数据需要反序列化或读入对象时,我总是先走另一条路。也就是说,首先实例化 .NET 对象,然后将其序列化。然后,我将缓慢而渐进地向 .NET 对象添加属性,以控制我希望它如何被序列化。无论如何, System.Xml.Serialization命名空间中的类将使您完全控制如何序列化对象。您可以将成员变量序列化为属性或元素。您可以序列化对象数组,甚至可以忽略成员变量。您可以将 xml 元素的名称更改为与成员变量名称不同...我的意思是它非常强大。
但无论如何,诀窍是倒退。先制作.NET对象,然后一点一点开始序列化成XML。一旦你得到它你喜欢的方式,它就可以很容易地自动反序列化。
所以自定义类型可以像这样被序列化/反序列化:
[Serializable]
[XmlRoot(Namespace = "www.google.com",
ElementName = "BuildServicOptions",
DataType = "string",
IsNullable = true)]
public class Options {...}
XML 如下所示:
<BuildServiceOptions ....>
</BuildServiceOptions>
数组可以这样序列化:
[XmlArray("EmailNotifications")]
[XmlArrayItem("email")]
public string[] EmailNotifications;
XML 如下所示:
<EmailNotifications>
<email>Peter@foo.com</email>
<email>James@foo.com</email>
<email>John@foo.com</email>
</EmailNotifications>
可以像这样忽略成员变量:
[XmlIgnore]
public string ServerProjectDir;
成员变量可以序列化为属性
[XmlAttribute("Name")]
public string ProjectName;
如果您有一个作为成员变量的自定义数据类型,那么这很容易:只需将序列化属性添加到该类即可。事实上,任何需要写入 XML 文件的类都应该在类定义中具有属性。