tags:

views:

41

answers:

1

Looking to nest (to unlimited levels) elements in XML. Like so:

<items>
    <item>
        <name>Item One</name>
        <item>
            <name>Item Two</name>
        </item>
        <item>
            <name>Item Three</name>
            <item>
                <name>Item Four</name>
            </item> <!-- etc... -->
        </item>
    </item>
</items>

However. While browsing for a solution I noticed in the comments of: http://stackoverflow.com/questions/988139/weird-nesting-in-xml while the above is well formed it would not validate against any sinsible DTD.

Two things, what is a better way of nesting similar elements, and secondly what would be the design of the DTD.

UPDATE: Would prefer to validate against an XML Schema rather than DTD.

+2  A: 

DTD allows you to define recursive structures like this. In fact, XML would be pretty useless if it couldn't handle that.

<!ELEMENT items (item*)>
<!ELEMENT item (name,item*)>
<!ELEMENT name (#PCDATA)>

XSD allows you to do it, too. It's just a bit more writing:

<xsd:element name="items">
  <xsd:complexType>
    <xsd:sequence>
      <xsd:element name="item" type="itemType" minOccurs="0" maxOccurs="unbounded"/>
    </xsd:sequence>
  </xsd:complexType>
</xsd:element>
<xsd:complexType name="itemType">
  <xsd:sequence>
    <xsd:element name="name" type="xsd:string"/>
    <xsd:element name="item" type="itemType" minOccurs="0" maxOccurs="unbounded"/>
  </xsd:sequence>
</xsd:complexType>
Welbog
thank you. can i confirm that this is a perfectly satisfactory and efficient way to store, for example, a list of categories in there hierarchical form.
esryl