📄 parserengine.cpp
字号:
} 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 + -