C# XmlSchemaSet - Resolving included schemas to enumerate attribute groups
- by satixx
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