, _doc (xmlCopyDoc (from->_doc, 1))
, _compression(from->compression())
{
-
+
}
XMLTree::~XMLTree()
_doc = 0;
}
- xmlParserCtxtPtr ctxt = NULL; /* the parser context */
+ /* create a parser context */
+ xmlParserCtxtPtr ctxt = xmlNewParserCtxt();
+ if (ctxt == NULL) {
+ return false;
+ }
xmlKeepBlanksDefault(0);
/* parse the file, activating the DTD validation option */
if (validate) {
- /* create a parser context */
- ctxt = xmlNewParserCtxt();
- if (ctxt == NULL) {
- return false;
- }
_doc = xmlCtxtReadFile(ctxt, _filename.c_str(), NULL, XML_PARSE_DTDVALID);
} else {
- _doc = xmlParseFile(_filename.c_str());
+ _doc = xmlCtxtReadFile(ctxt, _filename.c_str(), NULL, XML_PARSE_HUGE);
}
-
+
/* check if parsing suceeded */
if (_doc == NULL) {
- if (validate) {
- xmlFreeParserCtxt(ctxt);
- }
+ xmlFreeParserCtxt(ctxt);
return false;
} else {
/* check if validation suceeded */
_root = readnode(xmlDocGetRootElement(_doc));
/* free up the parser context */
- if (validate) {
- xmlFreeParserCtxt(ctxt);
- }
-
+ xmlFreeParserCtxt(ctxt);
+
return true;
}
xmlSetDocCompressMode(doc, _compression);
writenode(doc, _root, doc->children, 1);
result = xmlSaveFormatFileEnc(_filename.c_str(), doc, "UTF-8", 1);
+#ifndef NDEBUG
+ if (result == -1) {
+ xmlErrorPtr xerr = xmlGetLastError ();
+ if (!xerr) {
+ std::cerr << "unknown XML error during xmlSaveFormatFileEnc()." << std::endl;
+ } else {
+ std::cerr << "xmlSaveFormatFileEnc: error"
+ << " domain: " << xerr->domain
+ << " code: " << xerr->code
+ << " msg: " << xerr->message
+ << std::endl;
+ }
+ }
+#endif
xmlFreeDoc(doc);
if (result == -1) {
void
XMLTree::debug(FILE* out) const
{
+#ifdef LIBXML_DEBUG_ENABLED
xmlDocPtr doc;
XMLNodeList children;
writenode(doc, _root, doc->children, 1);
xmlDebugDumpDocument (out, doc);
xmlFreeDoc(doc);
+#endif
}
const string&
_proplist.clear ();
}
-XMLNode&
+XMLNode&
XMLNode::operator= (const XMLNode& from)
{
if (&from != this) {
XMLPropertyIterator curprop;
XMLNodeList nodes;
XMLNodeIterator curnode;
-
+
clear_lists ();
_name = from.name();
set_content(from.content());
-
+
props = from.properties();
for (curprop = props.begin(); curprop != props.end(); ++curprop) {
add_property((*curprop)->name().c_str(), (*curprop)->value());
}
-
+
nodes = from.children();
for (curnode = nodes.begin(); curnode != nodes.end(); ++curnode) {
add_child_copy(**curnode);
} else {
ctxt = xmlXPathNewContext(_doc);
}
-
+
boost::shared_ptr<XMLSharedNodeList> result =
boost::shared_ptr<XMLSharedNodeList>(find_impl(ctxt, xpath));
-
+
xmlXPathFreeContext(ctxt);
if (doc) {
xmlFreeDoc (doc);
{
string ns(n);
map<string,XMLProperty*>::iterator iter;
-
+
if ((iter = _propmap.find(ns)) != _propmap.end()) {
iter->second->set_value (v);
return iter->second;
{
if (_propmap.find(n) != _propmap.end()) {
XMLProperty* p = _propmap[n];
- _proplist.remove (p);
+ XMLPropertyIterator i = std::find(_proplist.begin(), _proplist.end(), p);
+ if (i != _proplist.end ()) {
+ _proplist.erase (i);
+ }
delete p;
_propmap.erase(n);
}
XMLNode::remove_nodes(const string& n)
{
XMLNodeIterator i = _children.begin();
- XMLNodeIterator tmp;
-
while (i != _children.end()) {
- tmp = i;
- ++tmp;
if ((*i)->name() == n) {
- _children.erase (i);
+ i = _children.erase (i);
+ } else {
+ ++i;
}
- i = tmp;
}
}
XMLNode::remove_nodes_and_delete(const string& n)
{
XMLNodeIterator i = _children.begin();
- XMLNodeIterator tmp;
while (i != _children.end()) {
- tmp = i;
- ++tmp;
if ((*i)->name() == n) {
delete *i;
- _children.erase (i);
+ i = _children.erase (i);
+ } else {
+ ++i;
}
- i = tmp;
}
}
XMLNode::remove_nodes_and_delete(const string& propname, const string& val)
{
XMLNodeIterator i = _children.begin();
- XMLNodeIterator tmp;
XMLProperty* prop;
while (i != _children.end()) {
- tmp = i;
- ++tmp;
-
prop = (*i)->property(propname);
if (prop && prop->value() == val) {
delete *i;
- _children.erase(i);
+ i = _children.erase(i);
+ } else {
+ ++i;
}
-
- i = tmp;
}
}
s << " " << (*i)->name() << "=\"" << (*i)->value() << "\"";
}
s << ">\n";
-
+
for (XMLNodeList::const_iterator i = _children.begin(); i != _children.end(); ++i) {
(*i)->dump (s, p + " ");
}
-
+
s << p << "</" << _name << ">\n";
}
}