2009-12-30 2 views
3

Я разбираю свой файл XSD. (включая некоторые элементы, complexTypes и simpleTypes)Как определить SimpleType в XSD-файле?

Я хочу определить каждый из них по свойству типа.

Мой XSD-файл немного подобен этому.

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

Мой пример код

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

Как определить тип атрибута SimpleType с имуществом оно или другим хорошим выражением?

+0

Может вам перефразируйте вопрос? Я не уверен, что вы пытаетесь сделать. – Diadistis

+0

@ Diadistis, Привет, я перефразировал свой вопрос. –

+1

Тупой вопрос, но у вашего анализатора XML не есть метод «elementName», который вы могли бы использовать для определения имени элемента, тем самым разрешив, что этот элемент называется «simpleType» или «complexType». Я не имею в виду доступ к имени атрибута, но имя фактического элемента. –

ответ

3

Если вы просто пытаетесь разобрать схему, вы должны взглянуть на this code sample из учебника How Do I...Use the Xml Schema Object Model?. (Я заметил, что ограничение не в полном объеме - это не получает тип ограничения базы или какие-либо аспекты.)

Применяя к вашему образцу кода дало бы что-то вроде этого:

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

Привет Tuzo. Это хороший способ сделать суждение для файла XSD, используя 'foreach (объект объекта в xmlSchema.Items)'. Думаю, ты дал мне еще одно хорошее решение. Благодарю. –

1

Вы пытаетесь разработать все части схемы, которые используют типы, определенные вами? Имеет ли схема подходящее пространство имен? Если это так, вы должны быть в состоянии сделать:

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

Пространство имен для XSD будет в TargetNamespace атрибута корневого элемента схемы. (Это немного сложнее, но мало).

Если XSD не имеет атрибута или по умолчанию целевого пространства имен, то вы можете указать, что вы хотите, когда вы добавляете схемы в XmlSchemaSet Добавить метод и ключ объекта от этого.

Если это не то, что вы пытаетесь сделать, дайте чуть более округлый пример в C# и XSD.

+0

@tyranid: Вы пытаетесь разработать все части схемы, которые используют типы, определенные вами? - ОТВЕТ - ДА; и мой XSD-файл TargetNamespace = "http://www.w3.org/2001/XMLSchema", который уже определен по умолчанию. –

+0

@tyranid, я обновил свой оригинальный пост выше. Спасибо. –

Смежные вопросы