2009-12-30 3 views
3

Je suis en train d'analyser mon fichier XSD. (y compris certains éléments, complexTypes et simpleTypes)Comment détecter le SimpleType dans un fichier XSD?

Je souhaite détecter chacun d'entre eux par propriété de type.

Mon fichier XSD ressemble un peu à ceci.

<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> 

Mon code exemple ci-dessous

// 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. 
    } 
} 

Comment détecter le type d'attribut est SimpleType avec la propriété de l'autre, il OU une bonne expression?

+0

Pouvez-vous reformulez la question? Je ne suis pas sûr de ce que vous essayez de faire. – Diadistis

+0

@Diadistis, Salut, j'ai reformulé ma question. –

+1

Dumb question, mais votre analyseur XML n'a pas une méthode "elementName" que vous pourriez utiliser pour déterminer le nom de l'élément, résolvant ainsi que l'élément est nommé "simpleType" ou "complexType". Je ne veux pas dire accéder au nom de l'attribut, mais au nom de l'élément lui-même. –

Répondre

3

Si vous essayez simplement d'analyser le schéma, vous devriez jeter un oeil à this code sample du tutoriel . (J'ai remarqué que la restriction est pas pleinement mis en œuvre - il ne reçoit pas le type de base de restriction ou des facettes.)

Application à votre exemple de code donnerait quelque chose comme ceci:

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

Bonjour Tuzo. C'est un bon moyen de juger le fichier XSD en utilisant 'foreach (objet objet dans xmlSchema.Items)'. Je pense que vous m'avez donné une autre bonne solution. Merci. –

1

Essayez-vous de définir toutes les parties du schéma qui utilisent des types définis par vous? Le schéma a-t-il un espace de nommage qualifié? Si donc vous devriez être en mesure de le faire:

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

L'espace de noms pour le XSD sera dans la targetNamespace attribut sur l'élément racine du schéma. (C'est un peu plus compliqué que ça mais pas beaucoup).

Si le XSD n'a pas d'attribut targetNamespace ou espace de noms par défaut, vous pouvez spécifier ce que vous voulez, quand vous ajoutez le schéma à XmlSchemaSet Ajouter méthode de objet et hors clé.

Si ce n'est pas ce que vous essayez de faire donner un exemple légèrement plus arrondi en C# et le XSD.

+0

@tyranid, Essayez-vous de définir toutes les parties du schéma qui utilisent les types définis par vous? - La réponse est OUI; et mon fichier XSD TargetNamespace = "http://www.w3.org/2001/XMLSchema" qui est déjà défini par défaut. –

+0

@tyranid, j'ai mis à jour mon post original ci-dessus. Je vous remercie. –

Questions connexes