tags:

views:

323

answers:

2

Hello.

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"&gt;
  <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?

Thank you.

+1  A: 

Are you trying to work out all parts of the schema which use types defined by you? Does the schema have a qualifying namespace? If so you should be able to do:

XmlSchemaType type = element.ElementSchemaType;
// Or type = attribute.AttributeSchemaType;
if(type.QualifiedName.Namespace == "http://mynamespace.com") {
    // Your type
}

The namespace for the XSD will be in the targetNamespace attribute on the root element of the schema. (It is slightly more complicated than that but not much).

If the XSD has no targetNamespace attribute or default namespace then you can specify whatever you want when you add the schema to XmlSchemaSet object's Add method and key off that.

If this is not what you are trying to do give a slightly more fully rounded example in C# and the XSD.

tyranid
@tyranid, Are you trying to work out all parts of the schema which use types defined by you? - ANSWER is YES; and my XSD file TargetNamespace = "http://www.w3.org/2001/XMLSchema" which already defined by default.
Nano HE
@tyranid, I updated my original post above. thank you.
Nano HE
+1  A: 

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.");
        }
    }
Tuzo
Hi Tuzo. It's a good way to do judgement for XSD file using `foreach (object item in xmlSchema.Items)`. I think you gaved me another good solution. Thanks.
Nano HE