blob: b6e26cf72d5514374bc9d3c0959a5240306aa3d4 [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 Veillard39a1f9a1999-01-17 19:11:59 +000084#define XML_ELEMENT_CONTENT_PCDATA 1
85#define XML_ELEMENT_CONTENT_ELEMENT 2
86#define XML_ELEMENT_CONTENT_SEQ 3
87#define XML_ELEMENT_CONTENT_OR 4
88
89#define XML_ELEMENT_CONTENT_ONCE 1
90#define XML_ELEMENT_CONTENT_OPT 2
91#define XML_ELEMENT_CONTENT_MULT 3
92#define XML_ELEMENT_CONTENT_PLUS 4
93
94typedef struct xmlElementContent {
95 int type; /* PCDATA, ELEMENT, SEQ or OR */
96 int ocur; /* ONCE, OPT, MULT or PLUS */
97 const CHAR *name; /* Element name */
98 struct xmlElementContent *c1; /* first child */
99 struct xmlElementContent *c2; /* second child */
100} xmlElementContent, *xmlElementContentPtr;
101
Daniel Veillard260a68f1998-08-13 03:39:55 +0000102#define XML_ELEMENT_TYPE_EMPTY 1
103#define XML_ELEMENT_TYPE_ANY 2
104#define XML_ELEMENT_TYPE_MIXED 3
105#define XML_ELEMENT_TYPE_ELEMENT 4
106
107typedef struct xmlElement {
Daniel Veillard39a1f9a1999-01-17 19:11:59 +0000108 const CHAR *name; /* Element name */
109 int type; /* The type */
110 xmlElementContentPtr content; /* the allowed element content */
Daniel Veillard260a68f1998-08-13 03:39:55 +0000111} xmlElement, *xmlElementPtr;
112
113/*
114 * An XML namespace.
115 * Note that prefix == NULL is valid, it defines the default namespace
116 * within the subtree (until overriden).
117 */
118
119#define XML_GLOBAL_NAMESPACE 1 /* old style global namespace */
120#define XML_LOCAL_NAMESPACE 2 /* new style local scoping */
121
122typedef struct xmlNs {
123 struct xmlNs *next; /* next Ns link for this node */
124 int type; /* global or local */
125 const CHAR *href; /* URL for the namespace */
126 const CHAR *prefix; /* prefix for the namespace */
127} xmlNs, *xmlNsPtr;
128
129/*
130 * An XML DtD, as defined by <!DOCTYPE.
131 */
132typedef struct xmlDtd {
133 const CHAR *name; /* Name of the DTD */
134 const CHAR *ExternalID; /* External identifier for PUBLIC DTD */
135 const CHAR *SystemID; /* URI for a SYSTEM or PUBLIC DTD */
136 void *elements; /* Hash table for elements if any */
137 void *entities; /* Hash table for entities if any */
138 /* struct xmlDtd *next; * next link for this document */
139} xmlDtd, *xmlDtdPtr;
140
141/*
142 * A attribute of an XML node.
143 */
144typedef struct xmlAttr {
Daniel Veillard27fb0751998-10-17 06:47:46 +0000145#ifndef XML_WITHOUT_CORBA
146 void *_private; /* for Corba, must be first ! */
147 void *vepv; /* for Corba, must be next ! */
148#endif
Daniel Veillardccb09631998-10-27 06:21:04 +0000149 xmlElementType type; /* XML_ATTRIBUTE_NODE, must be third ! */
Daniel Veillard260a68f1998-08-13 03:39:55 +0000150 struct xmlNode *node; /* attr->node link */
151 struct xmlAttr *next; /* parent->childs link */
152 const CHAR *name; /* the name of the property */
Daniel Veillardccb09631998-10-27 06:21:04 +0000153 struct xmlNode *val; /* the value of the property */
Daniel Veillard260a68f1998-08-13 03:39:55 +0000154} xmlAttr, *xmlAttrPtr;
155
156/*
157 * A node in an XML tree.
158 */
Daniel Veillard260a68f1998-08-13 03:39:55 +0000159typedef struct xmlNode {
Daniel Veillard27fb0751998-10-17 06:47:46 +0000160#ifndef XML_WITHOUT_CORBA
161 void *_private; /* for Corba, must be first ! */
162 void *vepv; /* for Corba, must be next ! */
163#endif
Daniel Veillardccb09631998-10-27 06:21:04 +0000164 xmlElementType type; /* type number in the DTD, must be third ! */
Daniel Veillard0bef1311998-10-14 02:36:47 +0000165 struct xmlDoc *doc; /* the containing document */
Daniel Veillard260a68f1998-08-13 03:39:55 +0000166 struct xmlNode *parent; /* child->parent link */
167 struct xmlNode *next; /* next sibling link */
Daniel Veillard0bef1311998-10-14 02:36:47 +0000168 struct xmlNode *prev; /* previous sibling link */
Daniel Veillard260a68f1998-08-13 03:39:55 +0000169 struct xmlNode *childs; /* parent->childs link */
Daniel Veillard39a1f9a1999-01-17 19:11:59 +0000170 struct xmlNode *last; /* last child link */
Daniel Veillard260a68f1998-08-13 03:39:55 +0000171 struct xmlAttr *properties; /* properties list */
Daniel Veillard260a68f1998-08-13 03:39:55 +0000172 const CHAR *name; /* the name of the node, or the entity */
173 xmlNs *ns; /* pointer to the associated namespace */
174 xmlNs *nsDef; /* namespace definitions on this node */
175 CHAR *content; /* the content */
176} xmlNode, *xmlNodePtr;
177
178/*
179 * An XML document.
180 */
181typedef struct xmlDoc {
Daniel Veillard27fb0751998-10-17 06:47:46 +0000182#ifndef XML_WITHOUT_CORBA
183 void *_private; /* for Corba, must be first ! */
184 void *vepv; /* for Corba, must be next ! */
185#endif
Daniel Veillardccb09631998-10-27 06:21:04 +0000186 xmlElementType type; /* XML_DOCUMENT_NODE, must be second ! */
Daniel Veillard260a68f1998-08-13 03:39:55 +0000187 char *name; /* name/filename/URI of the document */
188 const CHAR *version; /* the XML version string */
189 const CHAR *encoding; /* encoding, if any */
Daniel Veillard15a8df41998-09-24 19:15:06 +0000190 int compression;/* level of zlib compression */
Daniel Veillard260a68f1998-08-13 03:39:55 +0000191 int standalone; /* standalone document (no external refs) */
Daniel Veillard39a1f9a1999-01-17 19:11:59 +0000192 struct xmlDtd *intSubset; /* the document internal subset */
193 struct xmlDtd *extSubset; /* the document external subset */
Daniel Veillard260a68f1998-08-13 03:39:55 +0000194 struct xmlNs *oldNs; /* Global namespace, the old way */
Daniel Veillard260a68f1998-08-13 03:39:55 +0000195 struct xmlNode *root; /* the document tree */
196} xmlDoc, *xmlDocPtr;
197
198/*
199 * Variables.
200 */
201extern xmlNsPtr baseDTD;
202extern int oldXMLWDcompatibility;/* maintain compatibility with old WD */
203extern int xmlIndentTreeOutput; /* try to indent the tree dumps */
204
205/*
Daniel Veillard16253641998-10-28 22:58:05 +0000206 * Creating/freeing new structures
Daniel Veillard260a68f1998-08-13 03:39:55 +0000207 */
Daniel Veillard39a1f9a1999-01-17 19:11:59 +0000208extern xmlDtdPtr xmlCreateIntSubset(xmlDocPtr doc, const CHAR *name,
209 const CHAR *ExternalID, const CHAR *SystemID);
Daniel Veillard260a68f1998-08-13 03:39:55 +0000210extern xmlDtdPtr xmlNewDtd(xmlDocPtr doc, const CHAR *name,
211 const CHAR *ExternalID, const CHAR *SystemID);
212extern void xmlFreeDtd(xmlDtdPtr cur);
213extern xmlNsPtr xmlNewGlobalNs(xmlDocPtr doc, const CHAR *href, const CHAR *AS);
214extern xmlNsPtr xmlNewNs(xmlNodePtr node, const CHAR *href, const CHAR *AS);
215extern void xmlFreeNs(xmlNsPtr cur);
216extern xmlDocPtr xmlNewDoc(const CHAR *version);
217extern void xmlFreeDoc(xmlDocPtr cur);
Daniel Veillardccb09631998-10-27 06:21:04 +0000218extern xmlAttrPtr xmlNewDocProp(xmlDocPtr doc, const CHAR *name,
219 const CHAR *value);
Daniel Veillard260a68f1998-08-13 03:39:55 +0000220extern xmlAttrPtr xmlNewProp(xmlNodePtr node, const CHAR *name,
221 const CHAR *value);
Daniel Veillard260a68f1998-08-13 03:39:55 +0000222extern void xmlFreePropList(xmlAttrPtr cur);
223extern void xmlFreeProp(xmlAttrPtr cur);
Daniel Veillardbe36afe1998-11-27 06:39:50 +0000224extern xmlAttrPtr xmlCopyProp(xmlAttrPtr cur);
225extern xmlAttrPtr xmlCopyPropList(xmlAttrPtr cur);
226extern xmlDtdPtr xmlCopyDtd(xmlDtdPtr dtd);
227extern xmlDocPtr xmlCopyDoc(xmlDocPtr doc, int recursive);
Daniel Veillard16253641998-10-28 22:58:05 +0000228
229/*
230 * Creating new nodes
231 */
Daniel Veillard0bef1311998-10-14 02:36:47 +0000232extern xmlNodePtr xmlNewDocNode(xmlDocPtr doc, xmlNsPtr ns,
233 const CHAR *name, CHAR *content);
Daniel Veillardccb09631998-10-27 06:21:04 +0000234extern xmlNodePtr xmlNewNode(xmlNsPtr ns, const CHAR *name);
Daniel Veillard16253641998-10-28 22:58:05 +0000235extern xmlNodePtr xmlNewChild(xmlNodePtr parent, xmlNsPtr ns,
236 const CHAR *name, CHAR *content);
Daniel Veillard0bef1311998-10-14 02:36:47 +0000237extern xmlNodePtr xmlNewDocText(xmlDocPtr doc, const CHAR *content);
Daniel Veillard260a68f1998-08-13 03:39:55 +0000238extern xmlNodePtr xmlNewText(const CHAR *content);
Daniel Veillard0bef1311998-10-14 02:36:47 +0000239extern xmlNodePtr xmlNewDocTextLen(xmlDocPtr doc, const CHAR *content, int len);
Daniel Veillard260a68f1998-08-13 03:39:55 +0000240extern xmlNodePtr xmlNewTextLen(const CHAR *content, int len);
Daniel Veillard0bef1311998-10-14 02:36:47 +0000241extern xmlNodePtr xmlNewDocComment(xmlDocPtr doc, CHAR *content);
Daniel Veillard260a68f1998-08-13 03:39:55 +0000242extern xmlNodePtr xmlNewComment(CHAR *content);
Daniel Veillardccb09631998-10-27 06:21:04 +0000243extern xmlNodePtr xmlNewReference(xmlDocPtr doc, const CHAR *name);
Daniel Veillardbe36afe1998-11-27 06:39:50 +0000244extern xmlNodePtr xmlCopyNode(xmlNodePtr node, int recursive);
245extern xmlNodePtr xmlCopyNodeList(xmlNodePtr node);
Daniel Veillard16253641998-10-28 22:58:05 +0000246
247/*
248 * Navigating
249 */
Daniel Veillard260a68f1998-08-13 03:39:55 +0000250extern xmlNodePtr xmlGetLastChild(xmlNodePtr node);
251extern int xmlNodeIsText(xmlNodePtr node);
Daniel Veillard16253641998-10-28 22:58:05 +0000252
253/*
254 * Changing the structure
255 */
256extern xmlNodePtr xmlAddChild(xmlNodePtr parent, xmlNodePtr cur);
257extern void xmlUnlinkNode(xmlNodePtr cur);
258
259extern xmlNodePtr xmlTextMerge(xmlNodePtr first, xmlNodePtr second);
Daniel Veillard260a68f1998-08-13 03:39:55 +0000260extern void xmlTextConcat(xmlNodePtr node, const CHAR *content, int len);
Daniel Veillard16253641998-10-28 22:58:05 +0000261
Daniel Veillard260a68f1998-08-13 03:39:55 +0000262extern void xmlFreeNodeList(xmlNodePtr cur);
263extern void xmlFreeNode(xmlNodePtr cur);
Daniel Veillard16253641998-10-28 22:58:05 +0000264
265/*
266 * Namespaces
267 */
Daniel Veillard260a68f1998-08-13 03:39:55 +0000268extern xmlNsPtr xmlSearchNs(xmlDocPtr doc, xmlNodePtr node,
269 const CHAR *nameSpace);
270extern xmlNsPtr xmlSearchNsByHref(xmlDocPtr doc, xmlNodePtr node,
271 const CHAR *href);
272extern void xmlSetNs(xmlNodePtr node, xmlNsPtr ns);
Daniel Veillardbe36afe1998-11-27 06:39:50 +0000273extern xmlNsPtr xmlCopyNamespace(xmlNsPtr cur);
274extern xmlNsPtr xmlCopyNamespaceList(xmlNsPtr cur);
Daniel Veillard260a68f1998-08-13 03:39:55 +0000275
Daniel Veillard16253641998-10-28 22:58:05 +0000276/*
277 * Changing the content.
278 */
279extern xmlAttrPtr xmlSetProp(xmlNodePtr node, const CHAR *name,
280 const CHAR *value);
Daniel Veillard39a1f9a1999-01-17 19:11:59 +0000281extern CHAR *xmlGetProp(xmlNodePtr node, const CHAR *name);
Daniel Veillard16253641998-10-28 22:58:05 +0000282extern xmlNodePtr xmlStringGetNodeList(xmlDocPtr doc, const CHAR *value);
283extern xmlNodePtr xmlStringLenGetNodeList(xmlDocPtr doc, const CHAR *value,
284 int len);
285extern CHAR *xmlNodeListGetString(xmlDocPtr doc, xmlNodePtr list, int inLine);
286extern void xmlNodeSetContent(xmlNodePtr cur, const CHAR *content);
287extern void xmlNodeSetContentLen(xmlNodePtr cur, const CHAR *content, int len);
288extern void xmlNodeAddContent(xmlNodePtr cur, const CHAR *content);
289extern void xmlNodeAddContentLen(xmlNodePtr cur, const CHAR *content, int len);
290extern CHAR *xmlNodeGetContent(xmlNodePtr cur);
291
292/*
293 * Internal, don't use
294 */
Daniel Veillard260a68f1998-08-13 03:39:55 +0000295extern void xmlBufferWriteCHAR(const CHAR *string);
296extern void xmlBufferWriteChar(const char *string);
297
Daniel Veillard16253641998-10-28 22:58:05 +0000298/*
299 * Saving
300 */
Daniel Veillard151b1b01998-09-23 00:49:46 +0000301extern void xmlDocDumpMemory(xmlDocPtr cur, CHAR**mem, int *size);
302extern void xmlDocDump(FILE *f, xmlDocPtr doc);
303int xmlSaveFile(const char *filename, xmlDocPtr cur);
304
Daniel Veillard16253641998-10-28 22:58:05 +0000305/*
306 * Compression
307 */
Daniel Veillard15a8df41998-09-24 19:15:06 +0000308extern int xmlGetDocCompressMode (xmlDocPtr doc);
309extern void xmlSetDocCompressMode (xmlDocPtr doc, int mode);
Daniel Veillard151b1b01998-09-23 00:49:46 +0000310extern int xmlGetCompressMode(void);
311extern void xmlSetCompressMode(int mode);
Daniel Veillard260a68f1998-08-13 03:39:55 +0000312
313#ifdef __cplusplus
314}
315#endif
316
317#endif /* __XML_TREE_H__ */
318