⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 parserengine.cpp

📁 C++ class libraries for network-centric, portable applications, integrated perfectly with the C++ St
💻 CPP
📖 第 1 页 / 共 2 页
字号:
	}	XML_SetUserData(_parser, this);	XML_SetElementHandler(_parser, handleStartElement, handleEndElement);	XML_SetCharacterDataHandler(_parser, handleCharacterData);	XML_SetProcessingInstructionHandler(_parser, handleProcessingInstruction);	if (_expandInternalEntities)		XML_SetDefaultHandlerExpand(_parser, handleDefault);	else		XML_SetDefaultHandler(_parser, handleDefault);	XML_SetUnparsedEntityDeclHandler(_parser, handleUnparsedEntityDecl);	XML_SetNotationDeclHandler(_parser, handleNotationDecl);	XML_SetExternalEntityRefHandler(_parser, handleExternalEntityRef);	XML_SetCommentHandler(_parser, handleComment);	XML_SetCdataSectionHandler(_parser, handleStartCdataSection, handleEndCdataSection);	XML_SetDoctypeDeclHandler(_parser, handleStartDoctypeDecl, handleEndDoctypeDecl);	XML_SetEntityDeclHandler(_parser, handleEntityDecl);	XML_SetSkippedEntityHandler(_parser, handleSkippedEntity);	XML_SetParamEntityParsing(_parser, _externalParameterEntities ? XML_PARAM_ENTITY_PARSING_ALWAYS : XML_PARAM_ENTITY_PARSING_NEVER);	XML_SetUnknownEncodingHandler(_parser, handleUnknownEncoding, this);}void ParserEngine::handleError(int errorNo){	try	{		switch (errorNo)		{		case XML_ERROR_NO_MEMORY:			throw XMLException("No memory");		case XML_ERROR_SYNTAX:			throw SAXParseException("Syntax error", locator());		case XML_ERROR_NO_ELEMENTS:			throw SAXParseException("No element found", locator());		case XML_ERROR_INVALID_TOKEN:			throw SAXParseException("Invalid token", locator());		case XML_ERROR_UNCLOSED_TOKEN:			throw SAXParseException("Unclosed token", locator());		case XML_ERROR_PARTIAL_CHAR:			throw SAXParseException("Partial character", locator());		case XML_ERROR_TAG_MISMATCH:			throw SAXParseException("Tag mismatch", locator());		case XML_ERROR_DUPLICATE_ATTRIBUTE:			throw SAXParseException("Duplicate attribute", locator());		case XML_ERROR_JUNK_AFTER_DOC_ELEMENT:			throw SAXParseException("Junk after document element", locator());		case XML_ERROR_PARAM_ENTITY_REF:			throw SAXParseException("Illegal parameter entity reference", locator());		case XML_ERROR_UNDEFINED_ENTITY:			throw SAXParseException("Undefined entity", locator());		case XML_ERROR_RECURSIVE_ENTITY_REF:			throw SAXParseException("Recursive entity reference", locator());		case XML_ERROR_ASYNC_ENTITY:			throw SAXParseException("Asynchronous entity", locator());		case XML_ERROR_BAD_CHAR_REF:			throw SAXParseException("Reference to invalid character number", locator());		case XML_ERROR_BINARY_ENTITY_REF:			throw SAXParseException("Reference to binary entity", locator());		case XML_ERROR_ATTRIBUTE_EXTERNAL_ENTITY_REF:			throw SAXParseException("Reference to external entity in attribute", locator());		case XML_ERROR_MISPLACED_XML_PI:			throw SAXParseException("XML processing instruction not at start of external entity", locator());		case XML_ERROR_UNKNOWN_ENCODING:			throw SAXParseException("Unknown encoding", locator());		case XML_ERROR_INCORRECT_ENCODING:			throw SAXParseException("Encoding specified in XML declaration is incorrect", locator());		case XML_ERROR_UNCLOSED_CDATA_SECTION:			throw SAXParseException("Unclosed CDATA section", locator());		case XML_ERROR_EXTERNAL_ENTITY_HANDLING:			throw SAXParseException("Error in processing external entity reference", locator());		case XML_ERROR_NOT_STANDALONE:			throw SAXParseException("Document is not standalone", locator());		case XML_ERROR_UNEXPECTED_STATE:			throw SAXParseException("Unexpected parser state - please send a bug report", locator());				case XML_ERROR_ENTITY_DECLARED_IN_PE:			throw SAXParseException("Entity declared in parameter entity", locator());		case XML_ERROR_FEATURE_REQUIRES_XML_DTD:			throw SAXParseException("Requested feature requires XML_DTD support in Expat", locator());		case XML_ERROR_CANT_CHANGE_FEATURE_ONCE_PARSING:			throw SAXParseException("Cannot change setting once parsing has begun", locator());		case XML_ERROR_UNBOUND_PREFIX:			throw SAXParseException("Unbound prefix", locator());		case XML_ERROR_UNDECLARING_PREFIX:			throw SAXParseException("Must not undeclare prefix", locator());		case XML_ERROR_INCOMPLETE_PE:			throw SAXParseException("Incomplete markup in parameter entity", locator());		case XML_ERROR_XML_DECL:			throw SAXParseException("XML declaration not well-formed", locator());		case XML_ERROR_TEXT_DECL:			throw SAXParseException("Text declaration not well-formed", locator());		case XML_ERROR_PUBLICID:			throw SAXParseException("Illegal character(s) in public identifier", locator());		case XML_ERROR_SUSPENDED:			throw SAXParseException("Parser suspended", locator());		case XML_ERROR_NOT_SUSPENDED:			throw SAXParseException("Parser not suspended", locator());		case XML_ERROR_ABORTED:			throw SAXParseException("Parsing aborted", locator());		case XML_ERROR_FINISHED:			throw SAXParseException("Parsing finished", locator());		case XML_ERROR_SUSPEND_PE:			throw SAXParseException("Cannot suspend in external parameter entity", locator());		}		throw XMLException("Unknown Expat error code");	}	catch (SAXException& exc)	{		if (_pErrorHandler) _pErrorHandler->error(exc);		throw;	}	catch (Poco::Exception& exc)	{		if (_pErrorHandler) _pErrorHandler->fatalError(SAXParseException("Fatal error", locator(), exc));		throw;	}}	void ParserEngine::pushContext(XML_Parser parser, InputSource* pInputSource){	ContextLocator* pLocator = new ContextLocator(parser, pInputSource->getPublicId(), pInputSource->getSystemId());	_context.push_back(pLocator);}void ParserEngine::popContext(){	poco_assert (!_context.empty());	delete _context.back();	_context.pop_back();}void ParserEngine::resetContext(){	for (ContextStack::iterator it = _context.begin(); it != _context.end(); ++it)	{		delete *it;	}	_context.clear();}void ParserEngine::handleStartElement(void* userData, const XML_Char* name, const XML_Char** atts){	ParserEngine* pThis = reinterpret_cast<ParserEngine*>(userData);		if (pThis->_pContentHandler)	{		try		{			pThis->_pNamespaceStrategy->startElement(name, atts, XML_GetSpecifiedAttributeCount(pThis->_parser)/2, pThis->_pContentHandler);			}		catch (XMLException& exc)		{			throw SAXParseException(exc.message(), pThis->locator());		}	}}void ParserEngine::handleEndElement(void* userData, const XML_Char* name){	ParserEngine* pThis = reinterpret_cast<ParserEngine*>(userData);		if (pThis->_pContentHandler)	{		try		{			pThis->_pNamespaceStrategy->endElement(name, pThis->_pContentHandler);			}		catch (XMLException& exc)		{			throw SAXParseException(exc.message(), pThis->locator());		}	}}void ParserEngine::handleCharacterData(void* userData, const XML_Char* s, int len){	ParserEngine* pThis = reinterpret_cast<ParserEngine*>(userData);		if (pThis->_pContentHandler)		pThis->_pContentHandler->characters(s, 0, len);}void ParserEngine::handleProcessingInstruction(void* userData, const XML_Char* target, const XML_Char* data){	ParserEngine* pThis = reinterpret_cast<ParserEngine*>(userData);		if (pThis->_pContentHandler)		pThis->_pContentHandler->processingInstruction(target, data);}void ParserEngine::handleDefault(void* userData, const XML_Char* s, int len){}void ParserEngine::handleUnparsedEntityDecl(void* userData, const XML_Char* entityName, const XML_Char* base, const XML_Char* systemId, const XML_Char* publicId, const XML_Char* notationName){	ParserEngine* pThis = reinterpret_cast<ParserEngine*>(userData);		XMLString pubId;	if (publicId) pubId.assign(publicId);	if (pThis->_pDTDHandler) 		pThis->_pDTDHandler->unparsedEntityDecl(entityName, publicId ? &pubId : 0, systemId, notationName);}void ParserEngine::handleNotationDecl(void* userData, const XML_Char* notationName, const XML_Char* base, const XML_Char* systemId, const XML_Char* publicId){	ParserEngine* pThis = reinterpret_cast<ParserEngine*>(userData);		XMLString pubId;	if (publicId) pubId.assign(publicId);	XMLString sysId;	if (systemId) sysId.assign(systemId);	if (pThis->_pDTDHandler) 		pThis->_pDTDHandler->notationDecl(notationName, publicId ? &pubId : 0, systemId ? &sysId : 0);}int ParserEngine::handleExternalEntityRef(XML_Parser parser, const XML_Char* context, const XML_Char* base, const XML_Char* systemId, const XML_Char* publicId){	ParserEngine* pThis = reinterpret_cast<ParserEngine*>(XML_GetUserData(parser));	if (!context && !pThis->_externalParameterEntities) return XML_STATUS_ERROR;	if (context && !pThis->_externalGeneralEntities) return XML_STATUS_ERROR;	InputSource* pInputSource = 0;	EntityResolver* pEntityResolver = 0;	EntityResolverImpl defaultResolver;	XMLString sysId(systemId);	XMLString pubId;	if (publicId) pubId.assign(publicId);		URI uri(fromXMLString(pThis->_context.back()->getSystemId()));	uri.resolve(fromXMLString(sysId));	if (pThis->_pEntityResolver)	{		pEntityResolver = pThis->_pEntityResolver;		pInputSource = pEntityResolver->resolveEntity(publicId ? &pubId : 0, toXMLString(uri.toString()));	}	if (!pInputSource && pThis->_externalGeneralEntities)	{		pEntityResolver = &defaultResolver;		pInputSource = pEntityResolver->resolveEntity(publicId ? &pubId : 0, toXMLString(uri.toString()));	}	if (pInputSource)	{		XML_Parser extParser = XML_ExternalEntityParserCreate(pThis->_parser, context, 0);		try		{			pThis->parseExternal(extParser, pInputSource);		}		catch (XMLException&)		{			pEntityResolver->releaseInputSource(pInputSource);			XML_ParserFree(extParser);			throw;		}		pEntityResolver->releaseInputSource(pInputSource);		XML_ParserFree(extParser);		return XML_STATUS_OK;	}	else return XML_STATUS_ERROR;}int ParserEngine::handleUnknownEncoding(void* encodingHandlerData, const XML_Char* name, XML_Encoding* info){	ParserEngine* pThis = reinterpret_cast<ParserEngine*>(encodingHandlerData);		XMLString encoding(name);	EncodingMap::const_iterator it = pThis->_encodings.find(encoding);	if (it != pThis->_encodings.end())	{		const TextEncoding::CharacterMap& map = it->second->characterMap();		for (int i = 0; i < 256; ++i)			info->map[i] = map[i];					info->data    = it->second;		info->convert = &ParserEngine::convert;		info->release = 0;		return XML_STATUS_OK;	}	else return XML_STATUS_ERROR;}void ParserEngine::handleComment(void* userData, const XML_Char* data){	ParserEngine* pThis = reinterpret_cast<ParserEngine*>(userData);#if defined(XML_UNICODE_WCHAR_T)	if (pThis->_pLexicalHandler)		pThis->_pLexicalHandler->comment(data, 0, (int) wcslen(data));#else	if (pThis->_pLexicalHandler)		pThis->_pLexicalHandler->comment(data, 0, (int) strlen(data));#endif}void ParserEngine::handleStartCdataSection(void* userData){	ParserEngine* pThis = reinterpret_cast<ParserEngine*>(userData);	if (pThis->_pLexicalHandler)		pThis->_pLexicalHandler->startCDATA();}void ParserEngine::handleEndCdataSection(void* userData){	ParserEngine* pThis = reinterpret_cast<ParserEngine*>(userData);	if (pThis->_pLexicalHandler)		pThis->_pLexicalHandler->endCDATA();}void ParserEngine::handleStartNamespaceDecl(void* userData, const XML_Char* prefix, const XML_Char* uri){	ParserEngine* pThis = reinterpret_cast<ParserEngine*>(userData);	if (pThis->_pContentHandler)		pThis->_pContentHandler->startPrefixMapping((prefix ? XMLString(prefix) : EMPTY_STRING), (uri ? XMLString(uri) : EMPTY_STRING));}void ParserEngine::handleEndNamespaceDecl(void* userData, const XML_Char* prefix){	ParserEngine* pThis = reinterpret_cast<ParserEngine*>(userData);	if (pThis->_pContentHandler)		pThis->_pContentHandler->endPrefixMapping(prefix ? XMLString(prefix) : EMPTY_STRING);}void ParserEngine::handleStartDoctypeDecl(void* userData, const XML_Char* doctypeName, const XML_Char *systemId, const XML_Char* publicId, int hasInternalSubset){	ParserEngine* pThis = reinterpret_cast<ParserEngine*>(userData);	if (pThis->_pLexicalHandler)	{		XMLString sysId = systemId ? XMLString(systemId) : EMPTY_STRING;		XMLString pubId = publicId ? XMLString(publicId) : EMPTY_STRING;		pThis->_pLexicalHandler->startDTD(doctypeName, pubId, sysId);	}}void ParserEngine::handleEndDoctypeDecl(void* userData){	ParserEngine* pThis = reinterpret_cast<ParserEngine*>(userData);	if (pThis->_pLexicalHandler)		pThis->_pLexicalHandler->endDTD();}void ParserEngine::handleEntityDecl(void *userData, const XML_Char *entityName, int isParamEntity, const XML_Char *value, int valueLength, 	                                const XML_Char *base, const XML_Char *systemId, const XML_Char *publicId, const XML_Char *notationName){	if (value)		handleInternalParsedEntityDecl(userData, entityName, value, valueLength);	else		handleExternalParsedEntityDecl(userData, entityName, base, systemId, publicId);}void ParserEngine::handleExternalParsedEntityDecl(void* userData, const XML_Char* entityName, const XML_Char* base, const XML_Char* systemId, const XML_Char* publicId){	ParserEngine* pThis = reinterpret_cast<ParserEngine*>(userData);	XMLString pubId;	if (publicId) pubId.assign(publicId);	if (pThis->_pDeclHandler)		pThis->_pDeclHandler->externalEntityDecl(entityName, publicId ? &pubId : 0, systemId);}void ParserEngine::handleInternalParsedEntityDecl(void* userData, const XML_Char* entityName, const XML_Char* replacementText, int replacementTextLength){	ParserEngine* pThis = reinterpret_cast<ParserEngine*>(userData);	XMLString replText(replacementText, replacementTextLength);	if (pThis->_pDeclHandler)		pThis->_pDeclHandler->internalEntityDecl(entityName, replText);}void ParserEngine::handleSkippedEntity(void* userData, const XML_Char* entityName, int isParameterEntity){	ParserEngine* pThis = reinterpret_cast<ParserEngine*>(userData);		if (pThis->_pContentHandler)		pThis->_pContentHandler->skippedEntity(entityName);}int ParserEngine::convert(void* data, const char* s){	TextEncoding* pEncoding = reinterpret_cast<TextEncoding*>(data);	return pEncoding->convert((const unsigned char*) s);}} } // namespace Poco::XML

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -