Friday, October 07, 2011

Defining a file format using XML and XML Schema (XSD) in C#/Java - II

The complete implementation of XML file format is divided into the following steps:
  1. XML Schema (XSD) definition
    • Let an extension for my file type: .xef (XML example file-type)
    • Generate an XML file with data compatible to previously defined schema
  2. Validate my XML with the schema
  3. Compress huge data fragments
  4. Encrypt sensitive data
  5. Implementation in Java (Compliance with XSD 1.1)
 In the previous post, we have defined an XML schema and an example XML file based on the schema. In today's post, we will read/write/validate the XML file against the schema in C# using Visual Studio.
  1. Create a Windows Forms application.
  2. Add 3 buttons
    • Load
    • Load and Validate
    • Save

data:image/png;base64,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

Following is a code snippet for creating an XML document:
string  schemaName = "set.xsd";
XmlDocument document = new XmlDocument();
document.Load(fileName);
XmlElement xmlNode = doc.CreateElement("XmlFileFormat");

XmlAttribute attr = doc.CreateAttribute("xmlns:xsi");
attr.Value = "http://www.w3.org/2001/XMLSchema-instance";
xmlNode.SetAttributeNode(attr);

attr = doc.CreateAttribute("xsi:noNamespaceSchemaLocation");
attr.Value = m_schemaName;
xmlNode.SetAttributeNode(attr);

doc.AppendChild(xmlNode);
doc.Save(fileName);
And code snippet for loading this document:
string  schemaName = "set.xsd";
XmlDocument document = new XmlDocument();  
document.Load(fileName);
The validation is done using XmlSchema class:
string  schemaName = "set.xsd";
string  fileName = "set.xml";

XmlReaderSettings settings = new XmlReaderSettings();
settings.Schemas.Add(string.Empty, schemaName);
settings.ValidationType = ValidationType.Schema;

XmlReader reader = XmlReader.Create(fileName, settings);
XmlDocument document = new XmlDocument();
document.Load(reader);

ValidationEventHandler eventHandler = new ValidationEventHandler(OnValidation);
// the following call to Validate succeeds.
document.Validate(eventHandler);
reader.Close();
If anything is changed in the document we can always call document.Validate() with the OnValidation event handler: 
private void OnValidation(object sender, ValidationEventArgs e)
{
  switch (e.Severity)
  {
  case XmlSeverityType.Error:
    Console.WriteLine(e.Message);
    break;
  case XmlSeverityType.Warning:
    Console.WriteLine(e.Message);
    break;
  }
}
Very frequently we come to problems in XML data when we need to represent large data sets. Due to verbose tags, we need several byte even to write a single data byte. This causes an extreme overhead during serialization and data transfer over slower networks.. There were number of efforts seen in the open source and research communities to overcome this problem. In the next post, we will implement one mechanism in C# to compress large datasets.


The complete code can be downloaded from: http://keensocial.freeiz.com/blogs/xmlfileformat/xmlfileformat.zip. The project file can only be opened in Visual Studio 2010. If you have other versions of Visual Studio, you have to create a new solution and add the extracted files from the zip file to the solution.

Tuesday, October 04, 2011

Defining a file format using XML and XML Schema (XSD) in C#/Java - I

Occasionally I need a custom file type for new application. I prefer to use OLE/COM Structured Storage since it offers me a compact file-system like hierarchy with Storages and Streams to save application data in binary format. My open source application "UVFSEditor" can view a compound file along with other file formats. The storages are shown in a tree like structure at the left and the streams are displayed in a HexEditor.

For quite a long time Microsoft is not doing anything around OLE/COM structured storage and the company itself is moving away from this file format for its own applications in favor of some XML formats. I have also been looking for an alternative for new applications. XML is a viable alternative since the information can be viewed and edited with simple text editor, validated using XML schema validator, the data can easily be exported to other file formats.

I divided the complete work in the following steps:
  1. XML Schema (XSD) definition
    • Let an extension for my file type: .xef (XML example file-type)
    • Generate an XML file with data compatible to previously defined schema
  2. Validate my XML with the schema
  3. Compress huge data fragments
  4. Encrypt sensitive data
  5. Implementation in Java (Compliance with XSD 1.1)
Schema definition
A file type has a definite structure which helps the application to save and load data in a systematic way. An XML schema helps to define the type and size of data along with their relationship with each other which creates a predefined structure of a generated file. XML schema serves the same purpose as a relational schema serves for a database. The World Wide Web Consortium (W3C) has a recommendation for defining XML schema called XML Schema Definition Language (XSD). The most recent recommendation of XSD 1.1 is in candidate status. The language itself is in XML.

Let's start with my sample file-type schema:

<?xml version=“1.0“?>

<xsd:schema xmlns:xsd=“http://www.w3.org/2001/XMLSchema“>
 <xsd:element name=“Document“>
    <xsd:complexType>
     <xsd:sequence>
       <xsd:element name=“Value1“ type=“xsd:integer“></xsd:element>
       <xsd:element name=“Value2“ type=“xsd:string“></xsd:element>
       <xsd:element name=“Value3“ type=“xsd:float“></xsd:element>
       <xsd:element name=“Settings2“>
         <xsd:complexType>
           <xsd:sequence minOccurs=“0“ maxOccurs=“1“>
             <xsd:element name=“ValueX“ type=“xsd:integer“>
             </xsd:element>
             <xsd:element name=“ValueBulks“>
               <xsd:complexType>
                 <xsd:sequence>
                   <xsd:element name=“ValueBulk“ type=“xsd:float“ minOccurs=“0“ maxOccurs=“unbounded“/>
                 </xsd:sequence>
                 <xsd:attribute name=“Compress“ use=“optional“ type=“xsd:boolean“></xsd:attribute>
               </xsd:complexType>
             </xsd:element>
           </xsd:sequence>
         </xsd:complexType>
       </xsd:element>
     </xsd:sequence>
    </xsd:complexType>
 </xsd:element>
</xsd:schema>

Extension for New File Format
XML is a text format, so is XSD. A file in Windows OS almost always has an extension which provides information to the Windows Shell which application should be started once a file of particular type is, for example, double clicked in Windows explorer. For my test application, I take chosen .xef (XML example file-type) as file extension

Sample XML file definition

 10
 Test File Format
 101
 
    30
    
     1.0
     2.0
    
 


I prefer Visual Studio IDE and C# whenever I need to try some demo application which has a user interface. The next post of this blog will include how to read & write an XML file and validate it against our predefined schema using .Net framework classes.

The complete code can be downloaded from: http://keensocial.freeiz.com/blogs/xmlfileformat/xmlfileformat.zip. The project file can only be opened in Visual Studio 2010. If you have other versions of Visual Studio, you have to create a new solution and add the extracted files from the zip file to the solution.