예제 #1
0
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();
}
예제 #2
0
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();
}