Generate XSD from XML – XSD.EXE versus on-line tools
Posted by jpluimers on 2010/11/23
Quite a while ago, I wrote about the XSD.EXE tool to generate wrapper classes from an XSD file.
Recently, I had to create an XSD based on some XML.
Actually: a client was implementing a tool, that could export some of the data as XML.
That XML had to go into their database.
But the tool vendor told the client that the underlying XSD was ‘not supported’ (odd: why allow exporting XML and then not provide something supporting as the XSD?).
Anyway, the data was not that difficult, but having an XSD at hand made the import process a lot easier.
So lets see how to get a starting XSD from an of XML files (in practice, you would do this with a couple of XML files, then collect the best pieces into your final XSD).
The XML looked a lot like this (stored as document-in-document.xml):
<xml> <documents> <document id="a1"> <attribute name="Name" value="1a"/> <references> <document id="b1"> <attribute name="Name" value="1b"/> </document> <document id="b2"> <attribute name="Name" value="2b"/> </document> </references> </document> </documents> </xml>
So, basically it is an xml structure, containing a bunch of documents, each document can have attributes, and references to other documents.
According to the XSD.EXE documentation, it supports generating an XSD from an XML file.
However, for this kind of XML, you immediately get an error like this:
C:\temp\xml>"C:\Program Files\Microsoft SDKs\Windows\v6.1\Bin\xsd.exe" document-in-document.xml Microsoft (R) Xml Schemas/DataTypes support utility [Microsoft (R) .NET Framework, Version 2.0.50727.3038] Copyright (C) Microsoft Corporation. All rights reserved. Error: There was an error processing 'document-in-document.xml'. - The table (document) cannot be the child table to itself in nested relations. If you would like more help, please type "xsd /?".
The problem: XSD.EXE is aimed at .NET DataSets and those do not cope well with hierarchical data like this case.
Luckiliy, Stackoverflow got me on the right track: the first two other options to generate XSD from XML:
- The .NET way using the System.Xml.Schema.XmlSchemaInference.InferSchema() method (elaborated on by the Mono team)
- The Trang way (written in Java by James Clark of Relax NG fame)
Then How to Convert XML to Xsd Online on ehow.com pointed me to these as well:
- Online Flame-Ware XML-2-XSD 2.0
- HiT Software XML utilities (registration required)
- XmlForAsp XML Schema Generator
The last three do a much better job of generating the XSD.
Let’s examine the differences between the two.
Since 3. does not require an XML file (just pasting the XML text suffices) it is the easiest to use.
And it generates some pretty decent starting XSD as well:
<?xml version="1.0" encoding="utf-16"?> <xsd:schema attributeFormDefault="unqualified" elementFormDefault="qualified" version="1.0" xmlns:xsd="http://www.w3.org/2001/XMLSchema"> <xsd:element name="xml" type="xmlType" /> <xsd:complexType name="xmlType"> <xsd:sequence> <xsd:element name="documents" type="documentsType" /> </xsd:sequence> </xsd:complexType> <xsd:complexType name="documentsType"> <xsd:sequence> <xsd:element name="document" type="documentType" /> </xsd:sequence> </xsd:complexType> <xsd:complexType name="documentType"> <xsd:sequence> <xsd:element name="attribute" type="attributeType" /> <xsd:element name="references" type="referencesType" /> </xsd:sequence> <xsd:attribute name="id" type="xsd:string" /> </xsd:complexType> <xsd:complexType name="referencesType"> <xsd:sequence> <xsd:element maxOccurs="unbounded" name="document" type="documentType" /> </xsd:sequence> </xsd:complexType> <xsd:complexType name="documentType"> <xsd:sequence> <xsd:element name="attribute" type="attributeType" /> </xsd:sequence> <xsd:attribute name="id" type="xsd:string" /> </xsd:complexType> <xsd:complexType name="attributeType"> <xsd:attribute name="name" type="xsd:string" /> <xsd:attribute name="value" type="xsd:string" /> </xsd:complexType> <xsd:complexType name="attributeType"> <xsd:attribute name="name" type="xsd:string" /> <xsd:attribute name="value" type="xsd:string" /> </xsd:complexType> </xsd:schema>
So now you have a few alternatives when inferring XSD from XML.
–jeroen
via: Generate XSD from XML.
Finding the path of xsd.exe from your Visual Studio Build Events « The Wiert Corner – irregular stream of stuff said
[…] Generate XSD from XML – XSD.EXE versus on-line tools. […]
Generate XSD from XML – XSD.EXE versus on-line tools – take 2 « The Wiert Corner – irregular stream of stuff said
[…] via Generate XSD from XML – XSD.EXE versus on-line tools « The Wiert Corner – irregular stream of s…. […]
XSD aus XML mit mehreren Namespaces generieren | ProWebConsult said
[…] Es gibt natürlich auch noch diverse andere Tools, u.a. auch Online-Generatoren.Eine Übersicht findet man hier. […]
jpluimers said
Thanks for mentioning me in your article.
–jeroen
Generating a WordPress posting categories page – part 1 « The Wiert Corner – irregular stream of Wiert stuff said
[…] my comparison of tools for generating XSD from XML, so I used the XmlForAsp XML Schema generator, with the “Separate Complex Types” […]
Ling Chia said
Sorry, the XSD code was cut off by the forum server.
Ling Chia said
I pasted you sample XML code to XmlGrid.net, and generated the following XSD code. I’m not sure if this is what you expected.
jpluimers said
WordPress is very bad at handling XML and XSD. Will try myself later to see what XmlGrid delivers.
Ling Chia said
I think you can use online XML editor xmlgrid.net to generate XSD from an XML document. It is easy. You supply an XML file, and it returns you the XSD schema.
http://xmlgrid.net
select the XML to XSD link.
jpluimers said
Thanks!
Olaf Monien said
I have been using Oxygen of http://www.oxygenxml.com quite a lot lately. It also creates the XSD from your xml example just fine..
The advantage of Oxygen for me is, that it works on Windows AND Mac ;-)