2

我有一个非常大、复杂的 XML 文件,我希望将每个元素值提取到我已经创建的对象中。我已经尝试过 WCF DataContractSerializer 和普通 XmlSerializer ,它们都非常有问题。

除了使用上述方法解析我的 XML 并分配给对象之外,有人可以推荐最简单的方法来实现上述目标吗?

我正在考虑只使用 XDocument。

我的最终目标是从对象中获取值并序列化为新的 XML。

这是我原来的帖子 XML 反序列化到对象错误

4

4 回答 4

4

我通常分两步使用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 中创建的模式生成可以反序列化的类。

从那里您可以按原样使用对象,也可以将对象属性映射到类的属性。

于 2013-01-24T21:28:14.180 回答
0

DataContractSerializer 和 XmlSerializer 只能将 XML 水合到您已经拥有的对象中。即,它们仅在您从 X 类型的对象开始,将其序列化,然后将其反序列化回 X 类型时才有效。通常,如果您正在使用发布数据合约的服务,或者您是序列化的人,则可以使用它们自己的数据。请注意,我说它们序列化整个对象。这不仅仅是数据,还包括数据适合的结构和类型。

由于它显然不是一个序列化对象,因此您在构建自己的对象并使用 XDocument 将其分开的过程中处于正确的轨道上。

于 2013-01-24T21:24:34.727 回答
0

使用XmlReaderXmlTextReader

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 文件会很有帮助。

于 2013-01-24T21:30:11.277 回答
0

我一直在使用 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 文件的类都应该在类定义中具有属性。

于 2013-01-24T21:47:36.847 回答