开发者

.Net XML Serialization based on an XSD?

I've been serialising and deserialising .net objects using the XmlSerializer class without problem, however we now need somebody else to look at that data to perform some analysis on it.

In order to help with that we've produced an XSD based on our class like so: xsd.exe /t:DataClass Assembly.exe

The start of the XSD looks like this:

<?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" />

The XML is produced like this (where obj is an instance of our DataClass):

Dim xs As New XmlSerializer(obj.GetType)
Dim xmlTextWriter As New XmlTextWriter(memoryStream, Encoding.UTF8)
xs.Serialize(xmlTextWriter, obj)

...which produces XML looking like this:

<?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>

Bizarly, the XML produced does not adhere to the XSD generated from the same class.

My question then is, is there a way of telling the XmlSerializer to serialize the object based on a given XSD?

As an aside, I've looked at other ways of fixing this: I've tried re-generating the classes from the generated XSD -开发者_JAVA技巧 this seemed to have the same problem. I could explicitly state an ordering of elements using the XmlElement attribute, but I don't fancy doing that for 400+ public properties.


No, sorry. It doesn't seem like there is any way for forcing XmlSerializer to take a schema into account.

Try regenerating the classes using xsd.exe and the schema it generated (doing a roundtrip conversion).

xsd.exe dataClass.xsd /classes /language:cs

At very least it might give you some insight into which aspect of the original classes the xsd.exe command had trouble with.

Also maybe try this alternative to xsd: http://xsd2code.codeplex.com/

0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜