XML elements can be defined as building blocks of an XML document. Elements can behave as a container to hold text, elements, attributes, media objects or mix of all.
A DTD element is declared with an ELEMENT declaration. When an XML file is validated by DTD, parser initially checks for the root element and then the child elements are validated.
All DTD element declarations have this general form −
<!ELEMENT elementname (content)>
ELEMENT declaration is used to indicate the parser that you are about to define an element.
elementname is the element name (also called the generic identifier) that you are defining.
content defines what content (if any) can go within the element.
Content of elements declaration in a DTD can be categorized as below −
Empty content
Element content
Mixed content
Any content
This is a special case of element declaration. This element declaration does not contain any content. These are declared with the keyword EMPTY.
Syntax
Following is the syntax for empty element declaration −
<!ELEMENT elementname EMPTY >
In the above syntax −
ELEMENT is the element declaration of category EMPTY
elementname is the name of empty element.
Example
Following is a simple example demonstrating empty element declaration −
<?xml version = "1.0"?> <!DOCTYPE hr[ <!ELEMENT address EMPTY> ]> <address />
In this example address is declared as an empty element. The markup for address element would appear as <address />.
In element declaration with element content, the content would be allowable elements within parentheses. We can also include more than one element.
Syntax
Following is a syntax of element declaration with element content −
<!ELEMENT elementname (child1, child2...)>
ELEMENT is the element declaration tag
elementname is the name of the element.
child1, child2.. are the elements and each element must have its own definition within the DTD.
Example
Below example demonstrates a simple example for element declaration with element content −
<?xml version = "1.0" encoding = "UTF-8" standalone = "yes" ?> <!DOCTYPE address [ <!ELEMENT address (name,company,phone)> <!ELEMENT name (#PCDATA)> <!ELEMENT company (#PCDATA)> <!ELEMENT phone (#PCDATA)> ]> <address> <name>Tanmay Patil</name> <company>Howcodex</company> <phone>(011) 123-4567</phone> </address>
In the above example, address is the parent element and name, company and phone_no are its child elements.
Below table shows the list of operators and syntax rules which can be applied in defining child elements −
Operator | Syntax | Description | Example |
---|---|---|---|
+ | <!ELEMENT element-name (child1+)> | It indicates that child element can occur one or more times inside parent element. | <!ELEMENT address (name+)> Child element name can occur one or more times inside the element name address. |
* | <!ELEMENT element-name (child1*)> | It indicates that child element can occur zero or more times inside parent element. | <!ELEMENT address (name*)> Child element name can occur zero or more times inside the element name address. |
? | <!ELEMENT element-name (child1?)> | It indicates that child element can occur zero or one time inside parent element. | <!ELEMENT address (name?)> Child element name can occur zero or one time inside the element name address. |
, | <!ELEMENT element-name (child1, child2)> | It gives sequence of child elements separated by comma which must be included in the the element-name. | <!ELEMENT address (name, company)> Sequence of child elements name, company, which must occur in the same order inside the element name address. |
| | <!ELEMENT element-name (child1 | child2)> | It allows making choices in the child element. | <!ELEMENT address (name | company)> It allows you to choose either of child elements i.e. name or company, which must occur in inside the element name address. |
We need to follow certain rules if there is more than one element content −
Sequences − Often the elements within DTD documents must appear in a distinct order. If this is the case, you define the content using a sequence.
The declaration indicates that the <address> element must have exactly three children - <name>, <company>, and <phone> - and that they must appear in this order. For example −
<!ELEMENT address (name,company,phone)>
Choices − Suppose you need to allow one element or another, but not both. In such cases you must use the pipe (|) character. The pipe functions as an exclusive OR. For example −
<!ELEMENT address (mobile | landline)>
This is the combination of (#PCDATA) and children elements. PCDATA stands for parsed character data, that is, text that is not markup. Within mixed content models, text can appear by itself or it can be interspersed between elements. The rules for mixed content models are similar to the element content as discussed in the previous section.
Syntax
Following is a generic syntax for mixed element content −
<!ELEMENT elementname (#PCDATA|child1|child2)*>
ELEMENT is the element declaration tag.
elementname is the name of the element.
PCDATA is the text that is not markup. #PCDATA must come first in the mixed content declaration.
child1, child2.. are the elements and each element must have its own definition within the DTD.
The operator (*) must follow the mixed content declaration if children elements are included
The (#PCDATA) and children element declarations must be separated by the (|) operator.
Example
Following is a simple example demonstrating the mixed content element declaration in a DTD.
<?xml version = "1.0" encoding = "UTF-8" standalone = "yes" ?> <!DOCTYPE address [ <!ELEMENT address (#PCDATA|name)*> <!ELEMENT name (#PCDATA)> ]> <address> Here's a bit of text mixed up with the child element. <name> Tanmay Patil </name> </address>
You can declare an element using the ANY keyword in the content. It is most often referred to as mixed category element. ANY is useful when you have yet to decide the allowable contents of the element.
Syntax
Following is the syntax for declaring elements with ANY content −
<!ELEMENT elementname ANY>
Here, the ANY keyword indicates that text (PCDATA) and/or any elements declared within the DTD can be used within the content of the <elementname> element. They can be used in any order any number of times. However, the ANY keyword does not allow you to include elements that are not declared within the DTD.
Example
Following is a simple example demonstrating the element declaration with ANY content −
<?xml version = "1.0" encoding = "UTF-8" standalone = "yes" ?> <!DOCTYPE address [ <!ELEMENT address ANY> ]> <address> Here's a bit of sample text </address>