X::C tries to give you a simple data-structure in Perl,
however XML does not always map directly only that.
One such situation is where you have blocks within a list of elements.
In such case,
the block gets a name which is composed by the type of block and the first element in the block.
You will encounter these names in some error messages and when these block have a maxOccurs larger than 1.

Example.
The name cho_tic is used to represent the following nameless choice block:

In the default behavior, only the "local" names of the XML elements are used in the Perl structure. However, it is very well possible that the same name appears in more than on XML name-space, used within the same data structure. So see this often with substitutionGroups.

When collissions happen, you have to switch to use key_rewrite => 'PREFIXED' in the compile rules. All keys will now get rewritten: the name-space prefix will be prepended. The prefixes are defined by the mapping table provided with the prefixes option or by default from the XML schemas.

One of the more noticeable problems with schemas is the specification of the namespaces to be used for the schema. In older schema's, like many important protocols, there was no way to specify whether elements should be used qualified or not. Some schema's lack the target namespace declaration. Those fields did not exist in earlier versions of the "2001" spec; it was defined in the documentation.

The schema "forgets" to mention its targetNamespace, so it is overruled. The ::Cache extension handles prefixes much nicer than the ::Schema base object. So, with reading/writing the hash keys which relate to the elements in this schema will have xyz_ as prefix for clarity.

You may get an error message about a "missing data item" on a higher structural level than where the problem actually is. This especially happens with unions and substitutionGroups. The problem is cause by the fact that on a certain structural level, multiple alternatives may appear which only differ many levels deep in structure. X::C needs to scan all the alternatives, and when all fail it does not know which of the alternatives was "the best" alternative.