Re: [xml] trying to build a document with a shared dictionary
- From: Martijn Faassen <faassen infrae com>
- To: Martijn Faassen <faassen infrae com>
- Cc: xml gnome org
- Subject: Re: [xml] trying to build a document with a shared dictionary
- Date: Thu, 23 Sep 2004 17:39:20 +0200
Hey,
I'll take the opportunity to bring up this older issue again that I ran
into. You suggested then to use shared dictionaries between documents to
avoid a memory problem when moving nodes from one document to another.
Martijn Faassen wrote:
One of the suggestions made to solve my node moves into other document
problem is to make sure all documents share their dictionaries. The
following code is my attempt, but valgrind is still not happy when
freeing the documents:
#include "libxml/tree.h"
#include "libxml/parser.h"
/* parse document in context of document, sharing its dictionary */
static xmlDocPtr xmlSharedDictReadDoc(const xmlDocPtr doc,
const xmlChar* text) {
xmlParserCtxtPtr pctxt;
xmlDocPtr ret;
xmlInitParser();
/* parse from text in memory */
pctxt = xmlCreateDocParserCtxt(text);
/* make sure dictionary is shared with doc's */
if ((doc != NULL) && (doc->dict != NULL) && (pctxt->dict != NULL)) {
xmlDictFree(pctxt->dict);
pctxt->dict = doc->dict;
xmlDictReference(pctxt->dict);
}
/* no net-loads, no entity expansion */
xmlCtxtUseOptions(pctxt, XML_PARSE_NONET | XML_PARSE_NOENT);
/* parse document */
xmlParseDocument(pctxt);
if (pctxt->wellFormed) {
ret = pctxt->myDoc;
}
else {
ret = NULL;
if (pctxt->myDoc != NULL)
xmlFreeDoc(pctxt->myDoc);
pctxt->myDoc = NULL;
}
xmlFreeParserCtxt(pctxt);
return(ret);
}
int main() {
xmlDoc* doc1;
xmlDoc* doc2;
xmlNode* node;
xmlChar* text = "<doc>foo</doc>";
/* parse the first document */
doc1 = xmlSharedDictReadDoc(NULL, text);
/* parse the second document, sharing dictionary of the first */
doc2 = xmlSharedDictReadDoc(doc1, text);
/* get the root node of the first document */
node = xmlDocGetRootElement(doc1);
/* set the root element in the other document */
xmlDocSetRootElement(doc2, node);
/* not sure whether xmlSetTreeDoc is necessary */
xmlSetTreeDoc(node, doc2);
/* reconciliate namespaces; shouldn't matter in this case */
xmlReconciliateNs(doc2, node);
/* now free both documents */
xmlFreeDoc(doc1);
xmlFreeDoc(doc2);
}
Any suggestions? I rather lost in the parser APIs, so I may very well be
doing something wrong.
Regards,
Martijn
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]