我一直在使用XmlSerializer类序列化和反序列化.net对象,但是我们现在需要其他人来查看这些数据以对其执行一些分析。。基于XSD的.NET XML序列化?
为了帮助我们已经产生了XSD基于我们班就像这样: XSD.EXE /吨:DATACLASS Assembly.exe
的XSD的开始是这样的:
<?xml version="1.0" encoding="utf-8"?>
<xs:schema elementFormDefault="qualified" xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:element name="DataClass" nillable="true" type="DataClass" />
<xs:complexType name="DataClass">
<xs:complexContent mixed="false">
<xs:extension base="BaseDataClass">
<xs:sequence>
<xs:element minOccurs="0" maxOccurs="1" name="StudyID" type="xs:string" />
<xs:element minOccurs="1" maxOccurs="1" name="Position" type="xs:int" />
<xs:element minOccurs="1" maxOccurs="1" name="IViewer" type="xs:string" />
的XML产生这样(其中obj是我们的数据类的一个实例):
Dim xs As New XmlSerializer(obj.GetType)
Dim xmlTextWriter As New XmlTextWriter(memoryStream, Encoding.UTF8)
xs.Serialize(xmlTextWriter, obj)
...产生XML看起来像这样:
<?xml version="1.0" encoding="utf-8"?>
<DataClass xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<Version>SixMonthQ-E1</Version>
<IViewer xsi:nil="true" />
<Language xsi:nil="true" />
...
<StudyID>12345</StudyID>
很奇怪,产生的XML不遵守同一类生成的XSD。
我的问题是,是否有一种方法告诉XmlSerializer基于给定的XSD序列化对象?
顺便说一下,我已经研究了解决此问题的其他方法: 我试着从生成的XSD重新生成类 - 这似乎有同样的问题。 我可以使用XmlElement属性明确声明元素的排序,但我不喜欢为400多个公共属性做这件事。
请张贴类的细节,以及完整的XSD。它应该总是按照这个相同的XSD进行序列化。 – 2009-10-21 20:42:47
对不起,我不能那么做,但我确实开始将相关类复制到一个新项目中(以便将其减少到我可以发布的内容),并且令人惊讶的是,在新项目中,元素顺序XML rpoduced与架构中元素的顺序相匹配。这个项目必须有一些特定的东西强制XML按照这个顺序生成 - 任何想法都会影响到排序?关于更新代码的另一件事是,XML包含xsi:nil =“true”属性,但生成的XSD没有nillable =“true”属性 - 所以它仍然无法验证! – Nik 2009-10-23 12:40:25