The xmlTree API has limited support for reading DTDs, geared
towards using entities defined in an XML document. All DTD objects
are xmlNode's with various type values -
XML_DTD_NODE, XML_ENTITY_DECL, etc.
It's possible for an XML document two have two different DTDs, an
internal DTD and an external DTD. The XML_DTD_NODE object from
these can be fetched with the xmlTreeGetInternalSubset() and
xmlTreeGetExternalSubset() functions, respectively.
Entities are declared in the DTD, and when they are used in a
document, XML_ENTITY_REF nodes are used to refer back to the
entities. Consider the following XML document:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE top [
<!ENTITY ts "Thunderstone Software, LLC.">
<!ELEMENT top (#PCDATA)>
]>
<top>ts is &ts;!</top>
</capture>
This defines a single entity, ts, and it is referenced in the element top. Entities don't have to be dealt with if you don't want to:
XML_PARSE_NOENT option. This substitutes the entity's value
in the tree, so in the previous example <top> will only have
one text child, ts is Thunderstone Software, LLC.!, rather
than an entity reference. See xmlTreeNewDocFromFile()
(here) and
xmlTreeNewDocFromString()
(here) for more information.xmlTreeGetContent() on <top> will return
ts is Thunderstone Software, LLC.!, which performs the entity
substitution for you. It can also be called with NO_INLINE
to leave entity references in place. See xmlTreeGetContent()
(here) for more information.
The example document would have the following hierarchical structure
in the xmlTree API:
XML_DOC_NODE
| |
| |
| XML_DTD_NODE
| |
| +-XML_ENTITY_DECL <------\
| | |
| \-XML_ELEMENT_DECL |
| |
\-XML_ELEMENT_NODE <top> |
| |
+-XML_TEXT_NODE "ts is " |
| |
+-XML_ENTITY_REF |
| | |
| \---------------------/
|
\-XML_TEXT_NODE "!"
The element <top> actually has three children; the entity
reference, and the two text node children around it. The entity
reference appears to have a child, which just refers back to the
entity that was declared in the DTD. Calling
xmlTreeGetAllContent() on the XML_ENTITY_REF node will
properly return the entity's contents.
See the sample xmlTree09-DTD for an example of working
with an XML document and DTD like this.