1
votes

what is the difference between xmlschema.Items xmlschema.Elements ? They seem to return different things altogether ? what should i use when ? What should i do if i just want to simply get all the elements defined in the XSD sequentially ? I have used the .Items and .Elements approach , both give me different results , i am not sure which one would fit my use .

foreach(var entry in xmlschema.Elements)
            {
                 Console.WriteLine("{0}:{1}",entry.Key,entry.Value);
            }
 foreach (var obj in xmlschema.Items)
            {
                Console.WriteLine("{0}",obj.GetType());
            }

Update :- and why do both not pick up these

<attribute name="ref" type="IDREF"/>
  <attribute name="sequenceID" type="integer"/>
<element name="Metadata" type="s:MetadataType" abstract="true"/>
1

1 Answers

3
votes

The Elements collection is a Post Schema Validation Infoset (PSVI) that captures only elements defined at the schema level. This link on MSDN talks about PSVI.

The Items collection is pre-validation; those are XmlSchemaObjects defined at the schema level; they are in XML Schema source order.

As to using pre- vs. post-validation, it is a matter of requirements. For example, if you want to traverse the definitions in "source" order, then you would follow the non-PSVI; if all you want is to get to the infoset, the PSVI is your best bet; or if you have to be able to handle schemas that load but don't compile, then you're stuck with non-PSVI.

If you want elements in source order, you can only do so through the Items collection.

Global (schema level) attributes are showing up under Attributes collection.

Everything that's global, must show up in the Items collection, except for external references (xsd:include, xsd:import and xsd:redefine) that are showing up under Includes.

If something that's defined at the schema level doesn't show up in the Items collection, that would be a bug. I have to say though that I've never seen it before - please double check that what you're looking for is indeed defined as a child of the xsd:schema element.