C# – How to detect the SimpleType in XSD file

cxmlxsd

I am parsing my XSD file. (including some elements, complexTypes and simpleTypes)

I want to detect each of them by type property.

My XSD file a little like this.

<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema">
  <xsd:element name="mainInfo">
    <xsd:complexType>
      <xsd:sequence>
        <xsd:element ref="DocumentInfo" minOccurs="1" maxOccurs="1" />
        <xsd:element ref="Prerequisite" minOccurs="1" maxOccurs="1" />
      </xsd:sequence>
    </xsd:complexType>
  </xsd:element>
  <!-- Element of DocumentInfo -->
  <xsd:element name="DocumentInfo">
    <xsd:complexType>
      <xsd:attribute name="Name" type="xsd:string" />
      <xsd:attribute name="Description" type="xsd:string" />
    </xsd:complexType>
  </xsd:element>
  <!-- Element of Prerequisite -->
  <xsd:element name="Prerequisite">
    <xsd:complexType>
      <xsd:sequence>
        <xsd:element name="Type" type="Prerequisite.Type.type" minOccurs="1" maxOccurs="1" />
      </xsd:sequence>
    </xsd:complexType>
  </xsd:element>
  <xsd:complexType name="Prerequisite.Type.type">
    <xsd:attribute name="SystemType" type="SystemTypeEnum" />
  </xsd:complexType>
  <xsd:simpleType name="SystemTypeEnum">
    <xsd:restriction base="xsd:string">
      <xsd:enumeration value="Linux" />
    </xsd:restriction>
  </xsd:simpleType>
</xsd:schema>

My sample code below

  // Add the customer schema to a new XmlSchemaSet and compile it.
        // Any schema validation warnings and errors encountered reading or 
        // compiling the schema are handled by the ValidationEventHandler delegate.
        XmlSchemaSet schemaSet = new XmlSchemaSet();
        schemaSet.ValidationEventHandler += new ValidationEventHandler(ValidationCallback);
        schemaSet.Add("http://www.w3.org/2001/XMLSchema", "D:\\TMP\\test.xsd");
        schemaSet.Compile();

        // Retrieve the compiled XmlSchema object from the XmlSchemaSet
        // by iterating over the Schemas property.
        XmlSchema customerSchema = null;
        foreach (XmlSchema schema in schemaSet.Schemas())
        {
            customerSchema = schema;
        }



foreach (XmlSchemaElement element in customerSchema.Elements.Values)
{
    XmlSchemaComplexType complexType = element.ElementSchemaType as XmlSchemaComplexType;
     // currently, i detect my ComplexType via the method below. 
     if (aSchemaType.TypeCode == XmlTypeCode.None)
     {
     // Insert some code to handle ComplexType obj
        // Handle Elements of XSD File
        foreach (XmlSchemaElement element in customerSchema.Elements.Values)
        {
            XmlSchemaComplexType complexType = element.ElementSchemaType as XmlSchemaComplexType;
            Dictionary<string, object> aTempDict = new Dictionary<string,object>();

            mainDict.Add(element.Name, aTempDict);
            //Parse elements
            parseElement(complexType, ref aTempDict);
            break;
        }
     }

     // i want to find a method to detect my SimpleTYpe
     // a little like this way, but i don't want to compare the equal or not with some string value. (NO == "string", thanks.)
     else if (attribute.AttributeSchemaType.TypeCode == ???)
     // else if (Some other method to detect SimpleType in a XSD file)
    {
         // Insert some code to handle SimpleType obj
         // Loop the XSD Node and find out all the SimpleTye objects(members and type values), then add them to the related sub Dictionary based on ComplexType elements **TYPE** defined.
    }
}

How to detect the type of attribute is SimpleType with the it's property OR other good expression?

Best Answer

If you are just trying to parse the schema then you should take a look at this code sample from the tutorial How Do I...Use the Xml Schema Object Model?. (I did notice that the restriction is not fully implemented -- it doesn't get the restriction base type or any facets.)

Applying to your code sample would give something like this:

    // Add the customer schema to a new XmlSchemaSet and compile it.
    // Any schema validation warnings and errors encountered reading or 
    // compiling the schema are handled by the ValidationEventHandler delegate.
    XmlSchemaSet schemaSet = new XmlSchemaSet();
    schemaSet.ValidationEventHandler += new ValidationEventHandler(ValidationCallback);
    schemaSet.Add("http://www.w3.org/2001/XMLSchema", "D:\\TMP\\test.xsd");
    schemaSet.Compile();

    // Retrieve the compiled XmlSchema object from the XmlSchemaSet
    // by iterating over the Schemas property.
    XmlSchema customerSchema = null;
    foreach (XmlSchema schema in schemaSet.Schemas())
    {
        customerSchema = schema;
    }

    // Iterate over all schema items
    foreach (object item in xmlSchema.Items)
    {
        if (item is XmlSchemaAttribute)
        {
        }
        else if (item is XmlSchemaComplexType)
        {
        }
        else if (item is XmlSchemaSimpleType)
        {
            XmlSchemaSimpleType simpleType = item as XmlSchemaSimpleType;
            Console.WriteLine("SimpleType found with name=" + simpleType.Name);
        }
        else if (item is XmlSchemaElement)
        {
        }
        else if (item is XmlSchemaAnnotation)
        {
        }
        else if (item is XmlSchemaAttributeGroup)
        {
        }
        else if (item is XmlSchemaNotation)
        {
        }
        else if (item is XmlSchemaGroup)
        {
        }
        else
        {
            Console.WriteLine("Not Implemented.");
        }
    }
Related Topic