Create an XSD Schema….without knowing a darn thing about XSD.

Back in the old days, when dinosaurs roamed the earth, developers wanting to exchange data between applications used binary formatted data, hard-coded text field lengths, or delimited text files. Much parsing and error checking was involved. It was tedious.

With XML files a lot of that work can be done automatically… with one major drawback: You have to learn yet another 'language': XSD.

I don't know about you, but I feel the need to limit the amount of knowledge being poured into my brain on a daily basis… lest something gives (there is a fire-hose teacup analogy in there somewhere).

Here is how to create XML Schemas using classes in the .Net framework without knowing anything about XSD:

    protected void Button1_Click(object sender, EventArgs e)
    {
        // The DataSet name becomes the root XML element
        DataSet MyDataSet = new DataSet("Golfers");
 
        // This can be confusing, the 'DataTable' will actually
        // become Elements (Rows) in the XML file.
        DataTable MyDataTable = new DataTable("Golfer");
 
        MyDataSet.Tables.Add(MyDataTable);
 
        // Make columns attributes so we can 
        // link directly to a GridView
        MyDataTable.Columns.Add(new DataColumn("ID",
                                     typeof(System.Int32),
                                     null,
                                     MappingType.Attribute));
 
        MyDataTable.Columns.Add(new DataColumn("Name",
                                     typeof(String),
                                     null,
                                     MappingType.Attribute));
 
        MyDataTable.Columns.Add(new DataColumn("Birthday",
                                     typeof(DateTime),
                                     null,
                                     MappingType.Attribute));
 
        // Write out the XSD
        MyDataSet.WriteXmlSchema(@"C:\GolfersSchema.xsd");
 
        // Put some data in the table
        DataRow TempRow;
        TempRow = MyDataTable.NewRow();
        TempRow["ID"] = 1;
        TempRow["Name"] = "Bobby Jones";
        TempRow["Birthday"] = new DateTime(1902, 3, 17);
        MyDataTable.Rows.Add(TempRow);
 
        TempRow = MyDataTable.NewRow();
        TempRow["ID"] = 2;
        TempRow["Name"] = "Sam Snead";
        TempRow["Birthday"] = new DateTime(1912, 5, 27);
        MyDataTable.Rows.Add(TempRow);
 
        TempRow = MyDataTable.NewRow();
        TempRow["ID"] = 3;
        TempRow["Name"] = "Tiger Woods";
        TempRow["Birthday"] = new DateTime(1975, 12, 30);
        MyDataTable.Rows.Add(TempRow);
 
        // Write out the data
        MyDataSet.WriteXml(@"C:\Golfers.xml");
    }

Here is how the data is saved, not bad eh?

  <?xml version="1.0" standalone="yes"?>
  <Golfers>
    <Golfer ID="1" Name="Bobby Jones" Birthday="1902-03-17T00:00:00-05:00" />
    <Golfer ID="2" Name="Sam Snead" Birthday="1912-05-27T00:00:00-05:00" />
    <Golfer ID="3" Name="Tiger Woods" Birthday="1975-12-30T00:00:00-06:00" />
  </Golfers>

Here is what the Schema looks like. Note, you can always go into the schema and tweak things.

  <?xml version="1.0" standalone="yes"?>
  <xs:schema id="Golfers" xmlns="" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
    <xs:element name="Golfers" msdata:IsDataSet="true" msdata:UseCurrentLocale="true">
      <xs:complexType>
        <xs:choice minOccurs="0" maxOccurs="unbounded">
          <xs:element name="Golfer">
            <xs:complexType>
              <xs:attribute name="ID" type="xs:int" />
              <xs:attribute name="Name" type="xs:string" />
              <xs:attribute name="Birthday" type="xs:dateTime" />
            </xs:complexType>
          </xs:element>
        </xs:choice>
      </xs:complexType>
    </xs:element>
  </xs:schema>

Here is one way to validate the XML against the Schema:

    protected void Button2_Click(object sender, EventArgs e)
    {
        // First, read in the XML schema
        DataSet MyDataSet = new DataSet();
        MyDataSet.ReadXmlSchema(@"C:\GolfersSchema.xsd");
 
        // Now, read in the XML file (it is validated 
        // against the schema when it is read in).
        MyDataSet.ReadXml(@"C:\Golfers.xml");
 
        // See how it looks in a GridView
        GridView1.DataSource = MyDataSet;
        GridView1.DataBind();
    }

 

You can test the validation by modifying the XML file and trying to read it:

    <Golfer ID="abc" Name="Tiger Woods" Birthday="1975-12-30...

When the XML file is read, an exception will be generated. Without the XSD validation, the XML file is loaded without error.

I hope you find this useful.

Steve Wellens

By the way, Microsoft had an event for U of M graduates at Brit's Pub in Minneapolis, Minnesota last night. It was a great success. There was good food and great beer. In the drawing for prizes, the big ticket item, an Xbox 360, was won by the only female graduate in attendance…congratulations!

I got this pen :)

8 Comments

Comments have been disabled for this content.