C# XmlSchemaSet - Resolving included schemas to enumerate attribute groups

Posted by satixx on Stack Overflow See other posts from Stack Overflow or by satixx
Published on 2010-04-12T16:01:21Z Indexed on 2010/04/12 16:03 UTC
Read the original article Hit count: 1001

Filed under:
|
|
|
|

Hi,

I currently have a compiled XmlSchemaSet from which I get possible elements/attributes for each specific "parent" element defined in the schema.

I have a single "master" xsd schema which includes another schema and uses attributeGroup references for some "common" elements.

Here is a sample:

(MasterSchema.xsd)

<?xml version="1.0" encoding="utf-8"?>
<xs:schema 
    id="MasterSchema"
    xmlns:xs="http://www.w3.org/2001/XMLSchema"
    targetNamespace="CommonNamespace.xsd"
    xmlns="CommonNamespace.xsd"
    xmlns:mstns="CommonNamespace.xsd"
    elementFormDefault="qualified"
>

<xs:include schemaLocation="SourceAttributeGroups.xsd"/>

<xs:element name="Binding"  minOccurs="0" maxOccurs="2">
        <xs:complexType>
                    <xs:attribute name="Name" type="xs:string"/>
            <xs:attributeGroup ref="BindingSourceAttributeGroup"/>
        </xs:complexType>
</xs:element>
</xs:schema>

(SourceAttributeGroups.xsd)
<?xml version="1.0" encoding="utf-8"?>
<xs:schema 
    id="SourceAttributeGroups"
    xmlns:xs="http://www.w3.org/2001/XMLSchema"
    targetNamespace="CommonNamespace.xsd"
    xmlns="CommonNamespace.xsd"
    xmlns:mstns="CommonNamespace.xsd"
    elementFormDefault="qualified"
>

<xs:attributeGroup id="BindingSourceAttributeGroup" name="BindingSourceAttributeGroup">
  <xs:attribute name="Source">
            <xs:simpleType>
                <xs:restriction base="xs:string">
                    <xs:enumeration value="Data"/>
                </xs:restriction>
            </xs:simpleType>
    </xs:attribute>

    <!-- When Source is None -->
    <xs:attribute name="Value" type="xs:string"/>

    <!-- Label -->
    <xs:attribute name="Label" type="xs:string"/>   
</attributeGroup>
</xs:schema>

I would like to create an XmlSchemaSet in C# which would resolve, compile and "merge" every references of the MasterSchema so it would finaly look like this:

(MasterSchema.xsd)
<?xml version="1.0" encoding="utf-8"?>
<xs:schema 
    id="MasterSchema"
    xmlns:xs="http://www.w3.org/2001/XMLSchema"
    targetNamespace="CommonNamespace.xsd"
    xmlns="CommonNamespace.xsd"
    xmlns:mstns="CommonNamespace.xsd"
    elementFormDefault="qualified"
>

<xs:include schemaLocation="SourceAttributeGroups.xsd"/>

<xs:element name="Binding"  minOccurs="0" maxOccurs="2">
    <xs:complexType>
            <xs:attribute name="Name" type="xs:string"/>
        <xs:attribute name="Source">
               <xs:simpleType>
                  <xs:restriction base="xs:string">
                     <xs:enumeration value="Data"/>
                  </xs:restriction>
               </xs:simpleType>
            </xs:attribute>

           <!-- When Source is None -->
           <xs:attribute name="Value" type="xs:string"/>

           <!-- Label -->
           <xs:attribute name="Label" type="xs:string"/>    
    </xs:complexType>
</xs:element>
</xs:schema>

This way, I could traverse each XmlSchemaParticle of the compiled schema to get every single attribute for a specific element, even when its attributes are defined in an external schema. At the moment, when I get the possible attributes for a "Binding" element, I only get the "Name" attribute since it is originally defined in the "master" schema.

What would be the possible solutions to this problem?

Thanks!

Satixx

© Stack Overflow or respective owner

Related posts about xsd

Related posts about Xml