blob: ba77f761996c7509835ed685a9dcf7a4fd314142 [file] [log] [blame]
Daniel Veillard260a68f1998-08-13 03:39:55 +00001/*
2 * tree.h : describes the structures found in an tree resulting
3 * from an XML parsing.
4 *
5 * See Copyright for the status of this software.
6 *
Daniel Veillard39a1f9a1999-01-17 19:11:59 +00007 * Daniel.Veillard@w3.org
Daniel Veillard260a68f1998-08-13 03:39:55 +00008 */
9
10#ifndef __XML_TREE_H__
11#define __XML_TREE_H__
12
13
14#ifdef __cplusplus
15extern "C" {
16#endif
17
Daniel Veillard39a1f9a1999-01-17 19:11:59 +000018#include <stdio.h>
19
Daniel Veillard260a68f1998-08-13 03:39:55 +000020/*
Daniel Veillardccb09631998-10-27 06:21:04 +000021 * The different element types carried by an XML tree
22 *
23 * NOTE: This is synchronized with DOM Level1 values
24 * See http://www.w3.org/TR/REC-DOM-Level-1/
25 */
26typedef enum {
27 XML_ELEMENT_NODE= 1,
28 XML_ATTRIBUTE_NODE= 2,
29 XML_TEXT_NODE= 3,
30 XML_CDATA_SECTION_NODE= 4,
31 XML_ENTITY_REF_NODE= 5,
32 XML_ENTITY_NODE= 6,
33 XML_PI_NODE= 7,
34 XML_COMMENT_NODE= 8,
35 XML_DOCUMENT_NODE= 9,
36 XML_DOCUMENT_TYPE_NODE= 10,
37 XML_DOCUMENT_FRAG_NODE= 11,
38 XML_NOTATION_NODE= 12
39} xmlElementType;
40
41/*
Daniel Veillard0ba4d531998-11-01 19:34:31 +000042 * Size of an internal character representation.
43 *
44 * Currently we use 8bit chars internal representation for memory efficiency,
45 * but the parser is not tied to that, just define UNICODE to switch to
46 * a 16 bits internal representation. Note that with 8 bits wide
47 * CHARs one can still use UTF-8 to handle correctly non ISO-Latin
48 * input.
Daniel Veillard260a68f1998-08-13 03:39:55 +000049 */
50#ifdef UNICODE
51typedef unsigned short CHAR;
52#else
53typedef unsigned char CHAR;
54#endif
55
56/*
57 * a DTD Notation definition
58 * TODO !!!!
59 */
60
61/*
62 * a DTD Attribute definition
63 * TODO !!!!
64 */
65
Daniel Veillard39a1f9a1999-01-17 19:11:59 +000066#define XML_ATTRIBUTE_NONE 1
67#define XML_ATTRIBUTE_REQUIRED 2
68#define XML_ATTRIBUTE_IMPLIED 3
69#define XML_ATTRIBUTE_FIXED 4
70
71#define XML_ATTRIBUTE_STRING 1
72#define XML_ATTRIBUTE_ID 2
73#define XML_ATTRIBUTE_IDREF 3
74#define XML_ATTRIBUTE_IDREFS 4
75#define XML_ATTRIBUTE_ENTITY 5
76#define XML_ATTRIBUTE_ENTITIES 6
77#define XML_ATTRIBUTE_NMTOKEN 7
78#define XML_ATTRIBUTE_NMTOKENS 8
79#define XML_ATTRIBUTE_ENUMERATED 9
80
Daniel Veillard260a68f1998-08-13 03:39:55 +000081/*
82 * a DTD Element definition.
83 */
Daniel Veillard1899e851999-02-01 12:18:54 +000084typedef enum {
85 XML_ELEMENT_CONTENT_PCDATA=1,
86 XML_ELEMENT_CONTENT_ELEMENT,
87 XML_ELEMENT_CONTENT_SEQ,
88 XML_ELEMENT_CONTENT_OR
89} xmlElementContentType;
Daniel Veillard39a1f9a1999-01-17 19:11:59 +000090
Daniel Veillard1899e851999-02-01 12:18:54 +000091typedef enum {
92 XML_ELEMENT_CONTENT_ONCE=1,
93 XML_ELEMENT_CONTENT_OPT,
94 XML_ELEMENT_CONTENT_MULT,
95 XML_ELEMENT_CONTENT_PLUS
96} xmlElementContentOccur;
Daniel Veillard39a1f9a1999-01-17 19:11:59 +000097
98typedef struct xmlElementContent {
Daniel Veillard1899e851999-02-01 12:18:54 +000099 xmlElementContentType type; /* PCDATA, ELEMENT, SEQ or OR */
100 xmlElementContentOccur ocur; /* ONCE, OPT, MULT or PLUS */
101 const CHAR *name; /* Element name */
Daniel Veillard39a1f9a1999-01-17 19:11:59 +0000102 struct xmlElementContent *c1; /* first child */
103 struct xmlElementContent *c2; /* second child */
104} xmlElementContent, *xmlElementContentPtr;
105
Daniel Veillard1899e851999-02-01 12:18:54 +0000106typedef enum {
107 XML_ELEMENT_TYPE_EMPTY=1,
108 XML_ELEMENT_TYPE_ANY,
109 XML_ELEMENT_TYPE_MIXED,
110 XML_ELEMENT_TYPE_ELEMENT
111} xmlElementTypeVal;
Daniel Veillard260a68f1998-08-13 03:39:55 +0000112
113typedef struct xmlElement {
Daniel Veillard1899e851999-02-01 12:18:54 +0000114 const CHAR *name; /* Element name */
115 xmlElementTypeVal type; /* The type */
Daniel Veillard39a1f9a1999-01-17 19:11:59 +0000116 xmlElementContentPtr content; /* the allowed element content */
Daniel Veillard260a68f1998-08-13 03:39:55 +0000117} xmlElement, *xmlElementPtr;
118
119/*
120 * An XML namespace.
121 * Note that prefix == NULL is valid, it defines the default namespace
122 * within the subtree (until overriden).
123 */
124
Daniel Veillard1899e851999-02-01 12:18:54 +0000125typedef enum {
126 XML_GLOBAL_NAMESPACE=1, /* old style global namespace */
127 XML_LOCAL_NAMESPACE /* new style local scoping */
128} xmlNsType;
Daniel Veillard260a68f1998-08-13 03:39:55 +0000129
130typedef struct xmlNs {
131 struct xmlNs *next; /* next Ns link for this node */
Daniel Veillard1899e851999-02-01 12:18:54 +0000132 xmlNsType type; /* global or local */
Daniel Veillard260a68f1998-08-13 03:39:55 +0000133 const CHAR *href; /* URL for the namespace */
134 const CHAR *prefix; /* prefix for the namespace */
135} xmlNs, *xmlNsPtr;
136
137/*
138 * An XML DtD, as defined by <!DOCTYPE.
139 */
140typedef struct xmlDtd {
141 const CHAR *name; /* Name of the DTD */
142 const CHAR *ExternalID; /* External identifier for PUBLIC DTD */
143 const CHAR *SystemID; /* URI for a SYSTEM or PUBLIC DTD */
144 void *elements; /* Hash table for elements if any */
145 void *entities; /* Hash table for entities if any */
146 /* struct xmlDtd *next; * next link for this document */
147} xmlDtd, *xmlDtdPtr;
148
149/*
150 * A attribute of an XML node.
151 */
152typedef struct xmlAttr {
Daniel Veillard27fb0751998-10-17 06:47:46 +0000153#ifndef XML_WITHOUT_CORBA
154 void *_private; /* for Corba, must be first ! */
155 void *vepv; /* for Corba, must be next ! */
156#endif
Daniel Veillardccb09631998-10-27 06:21:04 +0000157 xmlElementType type; /* XML_ATTRIBUTE_NODE, must be third ! */
Daniel Veillard260a68f1998-08-13 03:39:55 +0000158 struct xmlNode *node; /* attr->node link */
159 struct xmlAttr *next; /* parent->childs link */
160 const CHAR *name; /* the name of the property */
Daniel Veillardccb09631998-10-27 06:21:04 +0000161 struct xmlNode *val; /* the value of the property */
Daniel Veillard260a68f1998-08-13 03:39:55 +0000162} xmlAttr, *xmlAttrPtr;
163
164/*
165 * A node in an XML tree.
166 */
Daniel Veillard260a68f1998-08-13 03:39:55 +0000167typedef struct xmlNode {
Daniel Veillard27fb0751998-10-17 06:47:46 +0000168#ifndef XML_WITHOUT_CORBA
169 void *_private; /* for Corba, must be first ! */
170 void *vepv; /* for Corba, must be next ! */
171#endif
Daniel Veillardccb09631998-10-27 06:21:04 +0000172 xmlElementType type; /* type number in the DTD, must be third ! */
Daniel Veillard0bef1311998-10-14 02:36:47 +0000173 struct xmlDoc *doc; /* the containing document */
Daniel Veillard260a68f1998-08-13 03:39:55 +0000174 struct xmlNode *parent; /* child->parent link */
175 struct xmlNode *next; /* next sibling link */
Daniel Veillard0bef1311998-10-14 02:36:47 +0000176 struct xmlNode *prev; /* previous sibling link */
Daniel Veillard260a68f1998-08-13 03:39:55 +0000177 struct xmlNode *childs; /* parent->childs link */
Daniel Veillard39a1f9a1999-01-17 19:11:59 +0000178 struct xmlNode *last; /* last child link */
Daniel Veillard260a68f1998-08-13 03:39:55 +0000179 struct xmlAttr *properties; /* properties list */
Daniel Veillard260a68f1998-08-13 03:39:55 +0000180 const CHAR *name; /* the name of the node, or the entity */
181 xmlNs *ns; /* pointer to the associated namespace */
182 xmlNs *nsDef; /* namespace definitions on this node */
183 CHAR *content; /* the content */
184} xmlNode, *xmlNodePtr;
185
186/*
187 * An XML document.
188 */
189typedef struct xmlDoc {
Daniel Veillard27fb0751998-10-17 06:47:46 +0000190#ifndef XML_WITHOUT_CORBA
191 void *_private; /* for Corba, must be first ! */
192 void *vepv; /* for Corba, must be next ! */
193#endif
Daniel Veillardccb09631998-10-27 06:21:04 +0000194 xmlElementType type; /* XML_DOCUMENT_NODE, must be second ! */
Daniel Veillard260a68f1998-08-13 03:39:55 +0000195 char *name; /* name/filename/URI of the document */
196 const CHAR *version; /* the XML version string */
197 const CHAR *encoding; /* encoding, if any */
Daniel Veillard15a8df41998-09-24 19:15:06 +0000198 int compression;/* level of zlib compression */
Daniel Veillard260a68f1998-08-13 03:39:55 +0000199 int standalone; /* standalone document (no external refs) */
Daniel Veillard39a1f9a1999-01-17 19:11:59 +0000200 struct xmlDtd *intSubset; /* the document internal subset */
201 struct xmlDtd *extSubset; /* the document external subset */
Daniel Veillard260a68f1998-08-13 03:39:55 +0000202 struct xmlNs *oldNs; /* Global namespace, the old way */
Daniel Veillard260a68f1998-08-13 03:39:55 +0000203 struct xmlNode *root; /* the document tree */
204} xmlDoc, *xmlDocPtr;
205
206/*
207 * Variables.
208 */
209extern xmlNsPtr baseDTD;
210extern int oldXMLWDcompatibility;/* maintain compatibility with old WD */
211extern int xmlIndentTreeOutput; /* try to indent the tree dumps */
212
213/*
Daniel Veillard16253641998-10-28 22:58:05 +0000214 * Creating/freeing new structures
Daniel Veillard260a68f1998-08-13 03:39:55 +0000215 */
Daniel Veillard39a1f9a1999-01-17 19:11:59 +0000216extern xmlDtdPtr xmlCreateIntSubset(xmlDocPtr doc, const CHAR *name,
217 const CHAR *ExternalID, const CHAR *SystemID);
Daniel Veillard260a68f1998-08-13 03:39:55 +0000218extern xmlDtdPtr xmlNewDtd(xmlDocPtr doc, const CHAR *name,
219 const CHAR *ExternalID, const CHAR *SystemID);
220extern void xmlFreeDtd(xmlDtdPtr cur);
221extern xmlNsPtr xmlNewGlobalNs(xmlDocPtr doc, const CHAR *href, const CHAR *AS);
222extern xmlNsPtr xmlNewNs(xmlNodePtr node, const CHAR *href, const CHAR *AS);
223extern void xmlFreeNs(xmlNsPtr cur);
224extern xmlDocPtr xmlNewDoc(const CHAR *version);
225extern void xmlFreeDoc(xmlDocPtr cur);
Daniel Veillardccb09631998-10-27 06:21:04 +0000226extern xmlAttrPtr xmlNewDocProp(xmlDocPtr doc, const CHAR *name,
227 const CHAR *value);
Daniel Veillard260a68f1998-08-13 03:39:55 +0000228extern xmlAttrPtr xmlNewProp(xmlNodePtr node, const CHAR *name,
229 const CHAR *value);
Daniel Veillard260a68f1998-08-13 03:39:55 +0000230extern void xmlFreePropList(xmlAttrPtr cur);
231extern void xmlFreeProp(xmlAttrPtr cur);
Daniel Veillardbe36afe1998-11-27 06:39:50 +0000232extern xmlAttrPtr xmlCopyProp(xmlAttrPtr cur);
233extern xmlAttrPtr xmlCopyPropList(xmlAttrPtr cur);
234extern xmlDtdPtr xmlCopyDtd(xmlDtdPtr dtd);
235extern xmlDocPtr xmlCopyDoc(xmlDocPtr doc, int recursive);
Daniel Veillard16253641998-10-28 22:58:05 +0000236
237/*
238 * Creating new nodes
239 */
Daniel Veillard0bef1311998-10-14 02:36:47 +0000240extern xmlNodePtr xmlNewDocNode(xmlDocPtr doc, xmlNsPtr ns,
241 const CHAR *name, CHAR *content);
Daniel Veillardccb09631998-10-27 06:21:04 +0000242extern xmlNodePtr xmlNewNode(xmlNsPtr ns, const CHAR *name);
Daniel Veillard16253641998-10-28 22:58:05 +0000243extern xmlNodePtr xmlNewChild(xmlNodePtr parent, xmlNsPtr ns,
244 const CHAR *name, CHAR *content);
Daniel Veillard0bef1311998-10-14 02:36:47 +0000245extern xmlNodePtr xmlNewDocText(xmlDocPtr doc, const CHAR *content);
Daniel Veillard260a68f1998-08-13 03:39:55 +0000246extern xmlNodePtr xmlNewText(const CHAR *content);
Daniel Veillard0bef1311998-10-14 02:36:47 +0000247extern xmlNodePtr xmlNewDocTextLen(xmlDocPtr doc, const CHAR *content, int len);
Daniel Veillard260a68f1998-08-13 03:39:55 +0000248extern xmlNodePtr xmlNewTextLen(const CHAR *content, int len);
Daniel Veillard0bef1311998-10-14 02:36:47 +0000249extern xmlNodePtr xmlNewDocComment(xmlDocPtr doc, CHAR *content);
Daniel Veillard260a68f1998-08-13 03:39:55 +0000250extern xmlNodePtr xmlNewComment(CHAR *content);
Daniel Veillardccb09631998-10-27 06:21:04 +0000251extern xmlNodePtr xmlNewReference(xmlDocPtr doc, const CHAR *name);
Daniel Veillardbe36afe1998-11-27 06:39:50 +0000252extern xmlNodePtr xmlCopyNode(xmlNodePtr node, int recursive);
253extern xmlNodePtr xmlCopyNodeList(xmlNodePtr node);
Daniel Veillard16253641998-10-28 22:58:05 +0000254
255/*
256 * Navigating
257 */
Daniel Veillard260a68f1998-08-13 03:39:55 +0000258extern xmlNodePtr xmlGetLastChild(xmlNodePtr node);
259extern int xmlNodeIsText(xmlNodePtr node);
Daniel Veillard16253641998-10-28 22:58:05 +0000260
261/*
262 * Changing the structure
263 */
264extern xmlNodePtr xmlAddChild(xmlNodePtr parent, xmlNodePtr cur);
265extern void xmlUnlinkNode(xmlNodePtr cur);
266
267extern xmlNodePtr xmlTextMerge(xmlNodePtr first, xmlNodePtr second);
Daniel Veillard260a68f1998-08-13 03:39:55 +0000268extern void xmlTextConcat(xmlNodePtr node, const CHAR *content, int len);
Daniel Veillard16253641998-10-28 22:58:05 +0000269
Daniel Veillard260a68f1998-08-13 03:39:55 +0000270extern void xmlFreeNodeList(xmlNodePtr cur);
271extern void xmlFreeNode(xmlNodePtr cur);
Daniel Veillard16253641998-10-28 22:58:05 +0000272
273/*
274 * Namespaces
275 */
Daniel Veillard260a68f1998-08-13 03:39:55 +0000276extern xmlNsPtr xmlSearchNs(xmlDocPtr doc, xmlNodePtr node,
277 const CHAR *nameSpace);
278extern xmlNsPtr xmlSearchNsByHref(xmlDocPtr doc, xmlNodePtr node,
279 const CHAR *href);
280extern void xmlSetNs(xmlNodePtr node, xmlNsPtr ns);
Daniel Veillardbe36afe1998-11-27 06:39:50 +0000281extern xmlNsPtr xmlCopyNamespace(xmlNsPtr cur);
282extern xmlNsPtr xmlCopyNamespaceList(xmlNsPtr cur);
Daniel Veillard260a68f1998-08-13 03:39:55 +0000283
Daniel Veillard16253641998-10-28 22:58:05 +0000284/*
285 * Changing the content.
286 */
287extern xmlAttrPtr xmlSetProp(xmlNodePtr node, const CHAR *name,
288 const CHAR *value);
Daniel Veillard39a1f9a1999-01-17 19:11:59 +0000289extern CHAR *xmlGetProp(xmlNodePtr node, const CHAR *name);
Daniel Veillard16253641998-10-28 22:58:05 +0000290extern xmlNodePtr xmlStringGetNodeList(xmlDocPtr doc, const CHAR *value);
291extern xmlNodePtr xmlStringLenGetNodeList(xmlDocPtr doc, const CHAR *value,
292 int len);
293extern CHAR *xmlNodeListGetString(xmlDocPtr doc, xmlNodePtr list, int inLine);
294extern void xmlNodeSetContent(xmlNodePtr cur, const CHAR *content);
295extern void xmlNodeSetContentLen(xmlNodePtr cur, const CHAR *content, int len);
296extern void xmlNodeAddContent(xmlNodePtr cur, const CHAR *content);
297extern void xmlNodeAddContentLen(xmlNodePtr cur, const CHAR *content, int len);
298extern CHAR *xmlNodeGetContent(xmlNodePtr cur);
299
300/*
301 * Internal, don't use
302 */
Daniel Veillard260a68f1998-08-13 03:39:55 +0000303extern void xmlBufferWriteCHAR(const CHAR *string);
304extern void xmlBufferWriteChar(const char *string);
305
Daniel Veillard16253641998-10-28 22:58:05 +0000306/*
307 * Saving
308 */
Daniel Veillard151b1b01998-09-23 00:49:46 +0000309extern void xmlDocDumpMemory(xmlDocPtr cur, CHAR**mem, int *size);
310extern void xmlDocDump(FILE *f, xmlDocPtr doc);
311int xmlSaveFile(const char *filename, xmlDocPtr cur);
312
Daniel Veillard16253641998-10-28 22:58:05 +0000313/*
314 * Compression
315 */
Daniel Veillard15a8df41998-09-24 19:15:06 +0000316extern int xmlGetDocCompressMode (xmlDocPtr doc);
317extern void xmlSetDocCompressMode (xmlDocPtr doc, int mode);
Daniel Veillard151b1b01998-09-23 00:49:46 +0000318extern int xmlGetCompressMode(void);
319extern void xmlSetCompressMode(int mode);
Daniel Veillard260a68f1998-08-13 03:39:55 +0000320
321#ifdef __cplusplus
322}
323#endif
324
325#endif /* __XML_TREE_H__ */
326