[xsd-users] Preserving XML element order

Barrie Kovish barrie.kovish at singularsoftware.com
Thu Feb 11 19:51:40 EST 2010


Boris,

We do need to add nodes to the tree so the last option appears to be out.  I had a look at XSD/e and it looks like it won't support XPATH queries which is also a significant limitation for us.

Currently I am investigating using Xerxes.  This presents a much more complex programming model so is not appealing!  

Barrie

On 2010-02-11, at 11:11 AM, Boris Kolpackov wrote:

> Hi Barrie,
> 
> Barrie Kovish <barrie.kovish at singularsoftware.com> writes:
> 
>> <xs:element name='A' type='xs:string'>
>> 
>> <xs:element name='W'>
>>  <xs:complexType>
>>   <xs:choice minOccurs='0' maxOccurs='unbounded'>
>>     <xs:element ref='A'/>
>>     <xs:element ref='B'/>
>>   </xs:choice>
>>  </xs:complexType>
>> </xs:element>
>> 
>> <xs:element name='U'>
>>  <xs:complexType>
>>   <xs:choice minOccurs='0' maxOccurs='unbounded'>
>>     <xs:element ref='W'/>
>>     <xs:element ref='V'/>
>>   </xs:choice>
>>    <xs:attribute name='id' type='xs:string'/>  
>>  </xs:complexType>
>> </xs:element>
>> 
>> I would say that 90% of the schema is structure like this.  There 
>> are probably 50-100 choice elements in the schema and another 100-200 
>> string and integer elements.
> 
> Barrie Kovish <barrie.kovish at singularsoftware.com> writes:
> 
>> There is probably another aspect of the schema I should mention.  The 
>> various element types are shared.  By this I mean the following:
>> 
>> <xs:element name='W'>
>>  <xs:complexType>
>>   <xs:choice minOccurs='0' maxOccurs='unbounded'>
>>     <xs:element ref='A'/>
>>     <xs:element ref='B'/>
>>   </xs:choice>
>>  </xs:complexType>
>> </xs:element>
>> 
>> 
>> <xs:element name='X'>
>>  <xs:complexType>
>>   <xs:choice minOccurs='0' maxOccurs='unbounded'>
>>     <xs:element ref='A'/>
>>     <xs:element ref='C'/>
>>   </xs:choice>
>>  </xs:complexType>
>> </xs:element>
>> 
>> 
>> So elements named A are shared between elements named X and W.
> 
> In such cases C++/Tree just makes two separate sequences, one for
> element A, another for element B. If you only had a handful of
> types that used such a choice construct then this could have been
> handled by customizing the corresponding types and proving order-
> sensitive storage as well as parsing and serialization. But if you 
> have a hundred of them then this approach won't scale. So I would
> suggest that you take a look at C++/Hybrid in XSD/e. This mapping
> will preserve ordering without any extra work from your side.
> 
> If you really want to stick to C++/Tree and XSD then there might be 
> a way to still work around this situation if you don't add/remove any 
> elements. I.e., the only modification that you make is the change of 
> values of attributes and simple type elements (e.g., A in the schema 
> above). In a nutshell, the idea is to use the original DOM document
> for structure and then re-set the elements and attributes with simple
> types from the object model. Because we can only get an object model
> node from a DOM node as xml_schema::type&, we will need to use the 
> polymorphic type map to call the serializer function in a polymorphic
> way. This add another limitation to this approach namely that none 
> of the simple type elements/attributes can have anonymous types since
> those are not registered in the maps. Let me know if you think this 
> might work for your situation and I will provide you with a more 
> detailed outline.
> 
> Boris




More information about the xsd-users mailing list