XMLParser::XMLParser(Common::ReadStream &stream, bool makeLower) : _rootNode(0) { initXML(); xmlDocPtr xml = 0; try { const int options = XML_PARSE_NOWARNING | XML_PARSE_NOBLANKS | XML_PARSE_NONET | XML_PARSE_NSCLEAN | XML_PARSE_NOCDATA; xml = xmlReadIO(readStream, closeStream, (void *) &stream, "stream.xml", 0, options); if (!xml) throw Common::Exception("XML document failed to parse"); xmlNodePtr root = xmlDocGetRootElement(xml); if (!root) throw Common::Exception("XML document has no root node"); _rootNode = new XMLNode(*root, makeLower); } catch (...) { delete _rootNode; xmlFreeDoc(xml); deinitXML(); throw; } xmlFreeDoc(xml); deinitXML(); }
XMLParser::XMLParser(Common::ReadStream &stream, bool makeLower, const Common::UString &fileName) { initXML(); Common::UString parseError; xmlSetGenericErrorFunc(static_cast<void *>(&parseError), errorFuncUString); const int options = XML_PARSE_NOWARNING | XML_PARSE_NOBLANKS | XML_PARSE_NONET | XML_PARSE_NSCLEAN | XML_PARSE_NOCDATA; xmlDocPtr xml = xmlReadIO(readStream, closeStream, static_cast<void *>(&stream), fileName.c_str(), 0, options); if (!xml) { Common::Exception e; if (!parseError.empty()) e.add("%s", parseError.c_str()); e.add("XML document failed to parse"); throw e; } BOOST_SCOPE_EXIT( (&xml) ) { xmlFreeDoc(xml); } BOOST_SCOPE_EXIT_END xmlNodePtr root = xmlDocGetRootElement(xml); if (!root) throw Common::Exception("XML document has no root node"); _rootNode.reset(new XMLNode(*root, makeLower)); deinitXML(); }