How to convert a legacy XDR into a valid (.Net) XSD

Well, after reserching this issue for about two days, and in the process even starting to create my XSD from scratch by hand, I found a very simple and elegant method provided by Micro$oft to convert their legacy XDR schema files into a valid and accepted XSD file.

However, the first trick is knowing that you’re dealing with an XDR. The following text posted at TopXML put me on the right track:

XML Data Reduced (XDR): DTDs proved to be inadequate for the needs of users of XML due to to a number of reasons. The main reasons behind the criticisms of DTDs were the fact that they used a different syntax than XML and their non-existent support for datatypes. XDR, a recommendation for XML schemas, was submitted to the W3C by the Microsoft Corporation as a potential XML schema standard which but was eventually rejected. XDR tackled some of the problems of DTDs by being XML based as well as supporting a number of datatypes analogous to those used in relational database management systems and popular programming languages. Below is an XML schema, using XDR, for the above XML fragment.
XDR FOR SAMPLE XML FRAGMENT

<Schema name="myschema" xmlns="urn:schemas-microsoft-com:xml-data"                       xmlns:dt="urn:schemas-microsoft-com:datatypes">  <ElementType name="age" dt:type="ui1" />  <ElementType name="name" dt:type="string" />  <AttributeType name="gtnum" dt:type="string" />  <ElementType name="gatech_student" order="seq">   <element type="name" minOccurs="1" maxOccurs="1"/>   <element type="age" minOccurs="1" maxOccurs="1"/>   <attribute type="gtnum" />  </ElementType> </Schema>

The above schema specifies types for a name element that contains a string as its content, an age element that contains an unsigned integer value of size one byte (i.e. btw 0 and 255), and a gtnum attribute that is a string value. It also specifies a gatech_student element that has one occurence each of a name and an age element in sequence as well as a gtnum attribute.

From there it was a hop-skip-and-a-jump to google the following, also found on TopXML to find out how to convert a XDR to XSD:

In the commandline type:

xsd file.xdr [/o:directory]

My, what a beautiful thing! That simple piece of information saved me hours, and potentially days of work.

Edit: One thing to note is that this conversion process does not bring over the quantifiers minOccurs and maxOccurs on the elements. They default all to one, so this must be updated manually. Note that a ‘*’ in XDR is the equivalent of ‘unbounded’ in XSL.

One Response to “How to convert a legacy XDR into a valid (.Net) XSD”

  1. HuberBlog :: Jason Huber Says:

    Its amazing the stuff you find dealing with just regular old TDD. Working towards a better solution brought us more information unrelated that we had no idea would be involved. Thanks for the information on the XDR, now I know where to find it.

    I use XML in a way that is so poor - pretty much like HTML. Just slap it in place and go. No DTD, XSD or XDR. I just make it right and start using it. Thanks for the information!

Leave a Reply