Flacid_Snake
Flacid_Snake

Reputation: 391

Parse XSD restrictions

    <xs:group name="datosGeneralesComunes">
    <xs:sequence>
        <xs:element name="gravedad">
            <xs:simpleType>
                <xs:restriction base="xs:integer">
                    <xs:minInclusive value="1" />
                    <xs:maxInclusive value="4" />
                </xs:restriction>
            </xs:simpleType>
        </xs:element>
        <xs:element name="zona">
            <xs:simpleType>
                <xs:restriction base="xs:integer">
                    <xs:minInclusive value="1" />
                    <xs:maxInclusive value="4" />
                </xs:restriction>
            </xs:simpleType>
        </xs:element>
        <xs:element minOccurs="0" name="descripcion">
            <xs:simpleType>
                <xs:restriction base="xs:string">
                    <xs:maxLength value="2000" />
                </xs:restriction>
            </xs:simpleType>
        </xs:element>
        <xs:element minOccurs="0" name="tipo_accidente_salida">
            <xs:simpleType>
                <xs:restriction base="xs:integer">
                    <xs:minInclusive value="1" />
                    <xs:maxInclusive value="2" />
                </xs:restriction>
            </xs:simpleType>
        </xs:element>
        <xs:element minOccurs="0" name="tipo_accidente_colision">
            <xs:simpleType>
                <xs:restriction base="xs:integer">
                    <xs:minInclusive value="1" />
                    <xs:maxInclusive value="13" />
                </xs:restriction>
            </xs:simpleType>
        </xs:element>
        <xs:element minOccurs="0" name="salida_via">
            <xs:simpleType>
                <xs:restriction base="xs:integer">
                    <xs:enumeration value="0" />
                    <xs:enumeration value="1" />
                </xs:restriction>
            </xs:simpleType>
        </xs:element>
        <xs:element minOccurs="0" name="tipo_accidente_animal">
            <xs:simpleType>
                <xs:restriction base="xs:integer">
                    <xs:minInclusive value="0" />
                    <xs:maxInclusive value="27" />
                </xs:restriction>
            </xs:simpleType>
        </xs:element>
        <xs:element name="unidad_demarcacion">
            <xs:simpleType>
                <xs:restriction base="xs:string">
                    <xs:maxLength value="10" />
                </xs:restriction>
            </xs:simpleType>
        </xs:element>
    </xs:sequence>
</xs:group>

I need to parse the restrictions of a XSD file that are inside a group, but I can only see (in debug view) the name of the elements (I see "derived from restriction", too). But I need the minInclusive and maxInclusive values.

This is my code so far:

XmlSchema schema;

                        using (var reader = new StreamReader(Path.Combine(Environment.CurrentDirectory, "esquema.xsd")))
                        {
                            schema = XmlSchema.Read(reader, null);
                        }

                        XmlSchemaSet schemaSet = new XmlSchemaSet();
                        schemaSet.Add(schema);
                        schemaSet.Compile();

After compiling the schema and enter debug mode, I can't see what I need. Any clues?

Regards

Upvotes: 1

Views: 1106

Answers (1)

Flacid_Snake
Flacid_Snake

Reputation: 391

Ok, let's assume we want to get the 21th item of the schema (that's the case of my XSD snippet). Here are all the steps one by one (also I've included a dynamic printing instead of checking all the possible types of a restriction). Hope it helps to somebody in the future...

schema = schemaSet.Schemas().Cast<XmlSchema>().Single();
XmlSchemaGroup g = schema.Items[21] as XmlSchemaGroup;
XmlSchemaElement ge = g.Particle.Items[0] as XmlSchemaElement;
XmlSchemaSimpleType gef = ge.ElementSchemaType as XmlSchemaSimpleType;
XmlSchemaSimpleTypeContent gefc = gef.Content as XmlSchemaSimpleTypeContent;
XmlSchemaSimpleTypeRestriction re = gefc as XmlSchemaSimpleTypeRestriction;
XmlSchemaObjectCollection fac = re.Facets;
foreach (var restriccion in fac)
{
    Console.WriteLine(restriccion.GetType().ToString()+": {0}", (restriccion as dynamic).Value);
    //if (restriccion.GetType().Equals(typeof(XmlSchemaLengthFacet)))
    //{
    //    Console.WriteLine("length: {0}", (restriccion as XmlSchemaLengthFacet).Value);
    //}
    //else if (restriccion.GetType().Equals(typeof(XmlSchemaMinInclusiveFacet)))
    //{
    //    Console.WriteLine("minInclusive: {0}", (restriccion as XmlSchemaMinInclusiveFacet).Value);
    //}
    //else if (restriccion.GetType().Equals(typeof(XmlSchemaMaxInclusiveFacet)))
    //{
    //    Console.WriteLine("maxInclusive: {0}", (restriccion as XmlSchemaMaxInclusiveFacet).Value);
    //}
}

Upvotes: 1

Related Questions