复杂的XML到对象

时间:2013-01-24 21:12:14

标签: c#

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

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

我正在考虑使用XDocument。

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

这是我原来的帖子 XML deserialization to object error

4 个答案:

答案 0 :(得分:3)

我通常在两个步骤中使用Microsoft's 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中创建的模式反序列化的类。

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

答案 1 :(得分:0)

DataContractSerializer和XmlSerializer只能将XML水合成您已有的对象。也就是说,只有从类型X的对象开始,序列化它,然后将其反序列化为类型X,它们才起作用。通常,如果您正在使用发布数据协定的服务,或者如果您是序列化的,则使用它们你自己的数据。请注意,我说他们序列化了整个对象。这不仅仅是数据,还包括数据所适合的结构和类型。

由于它显然不是一个序列化对象,因此您可以构建自己的对象并使用XDocument将其拆开。

答案 2 :(得分: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文件会很有帮助。

答案 3 :(得分: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文件的类都应该具有类定义的属性。