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.

No comments:

Post a Comment