Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to define DTD without strict element order?

Tags:

xml

dtd

As an XML "noob" I have discovered the importance of element order when creating an XML stream/file that is validated against a DTD. Is it possible to define a DTD that is not order dependent on elements ? If, so please provide syntactic example.

like image 869
angryITguy Avatar asked Apr 13 '11 02:04

angryITguy


2 Answers

You use or (a vertical pipe) and repeat (an asterisk:)

<!ELEMENT eltype1 ( eltype2 | eltype3)*>

This means eltype1 can contain any number of repetitions of eltype2 or eltype3.

like image 113
Ernest Friedman-Hill Avatar answered Oct 21 '22 05:10

Ernest Friedman-Hill


The only issue with the currently accepted answer is that it doesn't force only one of each element in any order. For example, you could have 2 eltype2 elements and no eltype3 elements.

If you need to be sure that both elements are present and that each occurs only one time, this is a more precise element declaration:

<!ELEMENT eltype1 ((eltype2, eltype3)|(eltype3, eltype2))>

Example in an internal subset:

<!DOCTYPE eltype1 [
<!ELEMENT eltype1 ((eltype2, eltype3)|(eltype3, eltype2))>
<!ELEMENT eltype2 (#PCDATA)>
<!ELEMENT eltype3 (#PCDATA)>
]>
<eltype1>
  <eltype3>element three</eltype3>
  <eltype2>element two</eltype2>
</eltype1>
like image 20
Daniel Haley Avatar answered Oct 21 '22 03:10

Daniel Haley