How to define SimpleType in an XSD file?

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

I want to define each of them by type property.

My XSD file is a bit 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 example is 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 determine the type of an attribute - is it SimpleType with its property or other good expression?

+3
source share
2 answers

If you're just trying to parse a schema, you should take a look at this sample code from the tutorial How do I ... Use the Xml Schema Object Model? . (I noticed that the constraint is not fully implemented - it does not receive the base type of the constraint or any faces.)

:

    // 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.");
        }
    }
+3

, , ? ? , :

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

XSD targetNamespace . ( , ).

XSD targetNamespace , , , XmlSchemaSet. .

If this is not what you are trying to do, you will get a slightly more rounded example in C # and XSD.

+1
source

Source: https://habr.com/ru/post/1726870/


All Articles