32 #ifndef _MOOT_XML_DOC_H 33 #define _MOOT_XML_DOC_H 37 #ifdef MOOT_LIBXML_ENABLED 43 #include <libxml/parser.h> 44 #include <libxml/tree.h> 45 #include <libxml/xpath.h> 46 #include <libxml/xpathInternals.h> 47 #include <libxml/xmlIO.h> 64 xmlXPathCompExprPtr cmp;
65 xmlXPathContextPtr ctx;
66 xmlXPathObjectPtr obj;
81 mootXPathQuery(
const std::string &xpathExpr=
"",
bool do_compile=
false)
88 if (do_compile) compile();
99 mootXPathQuery(
const std::string &xpathExpr,
101 xmlNodePtr ctx_node=NULL,
111 context(xml_doc,ctx_node);
112 if (do_eval) eval(do_sort);
116 mootXPathQuery(
const mootXPathQuery &q2)
125 inline ~mootXPathQuery(
void) { clear(); };
128 inline void clear(
void)
131 if (cmp) { xmlXPathFreeCompExpr(cmp); cmp = NULL; }
132 if (ctx) { xmlXPathFreeContext(ctx); ctx = NULL; }
133 if (obj) { xmlXPathFreeObject(obj); obj = NULL; }
142 inline xmlXPathCompExprPtr compile(
void)
145 cmp = xmlXPathCompile(BAD_CAST expr.c_str());
150 inline xmlXPathContextPtr context(xmlDocPtr xml_doc, xmlNodePtr ctx_node=NULL)
153 if (ctx) { xmlXPathFreeContext(ctx); ctx = NULL; }
154 if (obj) { xmlXPathFreeObject(obj); obj = NULL; }
155 if (!cmp)
return NULL;
156 ctx = xmlXPathNewContext(xml_doc);
157 if (ctx && ctx_node) ctx->node = ctx_node;
166 inline xmlXPathObjectPtr eval(
bool do_sort=
false)
169 if (obj) { xmlXPathFreeObject(obj); obj = NULL; }
170 if (!cmp || !ctx)
return NULL;
171 obj = xmlXPathCompiledEval(cmp,ctx);
172 if (do_sort && obj && obj->nodesetval) xmlXPathNodeSetSort(obj->nodesetval);
184 inline xmlXPathObjectPtr eval(xmlDocPtr xml_doc,
185 xmlNodePtr ctx_node=NULL,
187 bool do_compile=
false)
189 if (do_compile && !compile())
return NULL;
190 if (!context(xml_doc, ctx_node))
return NULL;
191 return eval(do_sort);
202 inline xmlNodeSetPtr nodeset(
void)
204 return (obj ? obj->nodesetval : NULL);
208 inline int size(
void)
210 return (obj && obj->nodesetval ? obj->nodesetval->nodeNr : 0);
217 inline xmlNodePtr first(
void)
227 inline xmlNodePtr cur(
void)
229 return (obj && obj->nodesetval && idx < obj->nodesetval->nodeNr
230 ? obj->nodesetval->nodeTab[idx]
238 inline xmlNodePtr next(
void)
240 return (obj && obj->nodesetval && ++idx < obj->nodesetval->nodeNr
241 ? obj->nodesetval->nodeTab[idx]
278 mootXmlDoc(
const std::string &myname =
"(unknown)",
279 int parse_options = 0,
280 bool do_format =
false)
283 xml_options(parse_options),
284 xml_format(do_format)
287 LIBXML_TEST_VERSION ;
294 virtual ~mootXmlDoc(
void)
304 virtual void reset(
void)
306 if (xml_doc) xmlFreeDoc(xml_doc);
318 virtual bool loadFilename(
const char *filename_or_url,
const char *encoding=NULL);
328 virtual bool loadFile(FILE * file,
329 const char * encoding =NULL,
330 const char * base_url =NULL,
331 const std::string& myname =
"");
341 virtual bool loadBuffer(
const char* buffer,
343 const char* base_url = NULL,
344 const char* encoding = NULL,
345 const std::string& myname =
"");
348 virtual bool _pre_load_hook(
void) {
return true; };
351 virtual bool _post_load_hook(
void) {
return true; };
366 virtual bool saveFilename(
const char *filename_or_url,
367 const char *encoding=NULL,
368 int compressMode=-1);
376 virtual bool saveFile(FILE *file,
const char *encoding=NULL);
386 virtual bool saveBuffer(xmlChar **buffer_ptr,
388 const char *encoding=NULL);
391 virtual bool _pre_save_hook(
void) {
return true; };
394 virtual bool _post_save_hook(
void) {
return true; };
404 inline xmlNodePtr root(
void)
406 return xml_doc ? xmlDocGetRootElement(xml_doc) : NULL;
413 inline xmlDocPtr document(
void)
415 return xml_doc ? xml_doc : (xml_doc = xmlNewDoc(BAD_CAST
"1.0"));
424 inline xmlNodePtr addNewNode(xmlNodePtr parent,
const char *name)
426 xmlNodePtr node = xmlNewNode(NULL, BAD_CAST name);
427 assert(node != NULL);
429 if (parent == NULL) {
432 if (parent == NULL) {
434 xmlDocSetRootElement(document(), node);
438 return xmlAddChild(parent,node);
446 static inline xmlNodePtr addNewText(xmlNodePtr parent,
const char *text)
448 assert(parent != NULL);
449 xmlNodePtr node = xmlNewText(BAD_CAST text);
450 assert(node != NULL);
451 return xmlAddChild(parent, node);
460 inline xmlNodePtr addComment(xmlNodePtr parent,
const char *text)
462 if (parent == NULL) {
464 return xmlNewDocComment(document(), BAD_CAST text);
467 xmlNodePtr cmt = xmlNewComment(BAD_CAST text);
469 return xmlAddChild(parent, cmt);
477 static inline void addContent(xmlNodePtr node,
const char *content)
479 assert(node != NULL);
480 xmlNodeAddContent(node, BAD_CAST content);
487 static inline void setContent(xmlNodePtr node,
const char *content)
489 assert(node != NULL);
490 xmlNodeSetContent(node, BAD_CAST content);
497 static inline xmlAttrPtr hasProp(xmlNodePtr node,
const char *name)
499 assert(node != NULL);
500 return xmlHasProp(node, BAD_CAST name);
509 static inline std::string getProp(xmlNodePtr node,
const char *name)
511 assert(node != NULL);
512 xmlChar *v = xmlGetProp(node, BAD_CAST name);
525 static inline xmlAttrPtr setProp(xmlNodePtr node,
529 assert(node != NULL);
530 return xmlSetProp(node, BAD_CAST name, BAD_CAST value);
539 static inline std::string attrValue(xmlAttrPtr attr_node)
541 assert(attr_node != NULL && attr_node->type == XML_ATTRIBUTE_NODE);
542 return std::string(attr_node->children != NULL && attr_node->children->content != NULL
543 ? (
const char *)attr_node->children->content
561 virtual mootXPathQuery *xpath(
const std::string &xpathExpr,
562 xmlNodePtr ctx_node=NULL,
566 mootXPathQuery *xpq =
new mootXPathQuery(xpathExpr);
567 if (!xpq->compile()) {
568 carp(
"could not compile XPath expression `%s'\n", xpq->expr.c_str());
572 else if (!xpq->context(xml_doc, ctx_node ? ctx_node : root())) {
573 carp(
"could not initialize XPath context for `%s'\n", xpq->expr.c_str());
577 else if (do_eval && !xpq->eval(do_sort)) {
578 carp(
"could not evaluate XPath query `%s'\n", xpq->expr.c_str());
591 virtual void carp(
char *fmt, ...)
593 fprintf(stderr,
"mootXmlDoc: ");
596 vfprintf(stderr, fmt, ap);
Definition: mootAssocVector.h:39
safely includes autoheader preprocessor macros