📄 hxxmlprs.cpp
字号:
strlen(pAttr->value)+1); pValues->SetPropertyCString( pAttr->name, pBuf); pBuf->Release(); } } rc = m_pResponse->HandleStartElement(pName, pValues, m_pParser->GetTagStartLineNumber(), m_pParser->GetTagStartColumnNumber()); HX_RELEASE(pValues); if(!pTag->m_need_close && SUCCEEDED(rc)) { rc = m_pResponse->HandleEndElement(pName,0,0); } } else { rc = m_pResponse->HandleEndElement(pName,0,0); } } break; default: { bDone = TRUE; } break; } }exit: HX_DELETE(pTag); return rc;}/* * HXStrictXMLParser methods */HXStrictXMLParser::HXStrictXMLParser(): m_pParser(NULL), m_pByteQueue(NULL) , m_pErrorNotifier(NULL){}HXStrictXMLParser::~HXStrictXMLParser(){ HX_DELETE(m_pParser); HX_DELETE(m_pByteQueue);}HX_RESULTHXStrictXMLParser::Init(IHXXMLParserResponse* pResponse, const char* pEncoding){ m_pResponse = pResponse; m_pResponse = pResponse; m_pParser = new XMLParser(TRUE, pEncoding); if (m_pErrorNotifier) { m_pParser->StoreErrors(); } m_pByteQueue = new CBigByteQueue(BUFSIZE); return HXR_OK;}HX_RESULTHXStrictXMLParser::InitErrorNotifier(ErrorNotifier* /*OUT*/ pNotifier){ m_pErrorNotifier = pNotifier; if (m_pParser) { m_pParser->StoreErrors(); } return HXR_OK; }HX_RESULTHXStrictXMLParser::Parse(IHXBuffer* pBuffer, BOOL bIsFinal){ HX_RESULT rc = HXR_OK; // See if we have any encoding info CheckEncoding(m_pParser, pBuffer); UINT32 ulBufLen = pBuffer->GetSize(); if(m_pByteQueue->GetAvailableElements() < ulBufLen) { m_pByteQueue->Grow(ulBufLen); } m_pByteQueue->EnQueue(pBuffer->GetBuffer(), ulBufLen); rc = DoParse(bIsFinal); return rc;}HX_RESULTHXStrictXMLParser::HandleErrors(CHXPtrArray* pErrs){ if (m_pErrorNotifier && pErrs) { int size = pErrs->GetSize(); for(int i=0;i<size;++i) { XMLError* pError = (XMLError*) (*pErrs)[i]; HX_RESULT code = ConvertToHX_RESULT(pError->m_errorTag); m_pErrorNotifier->ErrorInLastTag(code, pError->m_pErrorString, pError->m_pFrameString, pError->m_lLineNumber, pError->m_lLinePosition); } } return HXR_OK;}HX_RESULTHXStrictXMLParser::ConvertToHX_RESULT(UINT32 err){ HX_RESULT ret = HXR_OK; switch (err) { case XMLUnknownError: ret = HXR_XML_GENERALERROR; break; case XMLErrorNoClose: ret = HXR_XML_NOCLOSE; break; case XMLErrorBadAttribute: ret = HXR_XML_BADATTRIBUTE; break; case XMLErrorNoValue: ret = HXR_XML_NOVALUE; break; case XMLErrorMissingQuote: ret = HXR_XML_MISSINGQUOTE; break; case XMLErrorBadEndTag: ret = HXR_XML_BADENDTAG; break; case XMLErrorNoTagType: ret = HXR_XML_NOTAGTYPE; break; case XMLErrorDupAttribute: ret = HXR_XML_DUPATTRIBUTE; break; case XMLErrorCommentBeforeProcInst: ret = HXR_XML_COMMENT_B4_PROCINST; break; case XMLErrorInvalidName: ret = HXR_XML_INVALID_NAME; break; case XMLErrorInvalidCharInDoc: ret = HXR_XML_INVALID_CHAR_IN_DOC; break; case XMLErrorTwoDashNotAllowed: ret = HXR_XML_TWO_DASHES_NOT_ALLOWED_IN_COMMENT; break; case XMLErrorInvalidDecl: ret = HXR_XML_INVALID_DECL; break; case XMLErrorInvalidPI: ret = HXR_XML_INVALID_PI; break; case XMLErrorInvalidPITarget: ret = HXR_XML_INVALID_PI_TARGET; break; case XMLErrorInvalidCDATA: ret = HXR_XML_INVALID_CDATA; break; case XMLErrorInvalidRef: ret = HXR_XML_INVALID_REF; break; case XMLErrorMissingEquals: ret = HXR_XML_MISSING_EQUALS; break; case XMLErrorMissingReqSpace: ret = HXR_XML_MISSING_REQ_SPACE; break; case XMLErrorLTnotAllowed: ret = HXR_XML_LT_NOT_ALLOWED; break; case XMLErrorInvalidGTafter2RSQB: ret = HXR_XML_INVALID_GT_AFFT_2_RSQB_IN_CONTENT; break; case XMLErrorInvalidComment: ret = HXR_XML_INVALID_COMMENT; break; } return ret;}HX_RESULTHXStrictXMLParser::DoParse(BOOL bIsFinal){ HX_RESULT rc = HXR_OK; XMLTag* pTag = NULL; BOOL bDone = FALSE; while(!bDone && HXR_OK == rc) { UINT32 bytesUsed; UINT32 bytesAvail = m_pByteQueue->GetQueuedItemCount(); if(bytesAvail <= 0) { break; } BYTE* pBuf = new BYTE[bytesAvail]; BYTE* p = pBuf; m_pByteQueue->DeQueue(pBuf, bytesAvail); bytesUsed = bytesAvail; if(pTag) { delete pTag; pTag = 0; } XMLParseResult pResult = m_pParser->Parse((const char*&)p, bytesAvail, pTag, bIsFinal); m_pByteQueue->EnQueue(p, (UINT32)(bytesAvail - (p - pBuf))); // pBuf is not used anymore, so delete HX_VECTOR_DELETE(pBuf); p = NULL; UINT32 ulTagStartLine = m_pParser->GetTagStartLineNumber(); UINT32 ulTagStartCol = m_pParser->GetTagStartColumnNumber(); switch(pResult) { case XMLPNotDone: { goto exit; } case XMLPNoClose: { rc = HXR_XML_NOCLOSE; goto exit; } case XMLPBadAttribute: { rc = HXR_XML_NOTAGTYPE; goto exit; } case XMLPBadEndTag: { rc = HXR_XML_BADENDTAG; goto exit; } case XMLPAttributeValueNotQuoted: { rc = HXR_XML_MISSINGQUOTE; goto exit; } case XMLPBadDirective: { rc = HXR_XML_GENERALERROR; goto exit; } case XMLPDupAttribute: { rc = HXR_XML_DUPATTRIBUTE; goto exit; } case XMLPCommentBeforeProcInst: { rc = HXR_XML_COMMENT_B4_PROCINST; goto exit; } case XMLPComment: { const char* pValue = pTag->m_cur_attribute->value; rc = m_pResponse->HandleComment(pValue,ulTagStartLine,ulTagStartCol); HandleErrors(pTag->m_errs); } break; case XMLPPlainText: { const char* pValue = pTag->m_cur_attribute->value; CHXBuffer* pBuffer = new CHXBuffer; pBuffer->AddRef(); pBuffer->Set((const BYTE*)pValue, strlen(pValue)+1); rc = m_pResponse->HandleCharacterData(pBuffer,ulTagStartLine,ulTagStartCol); HandleErrors(pTag->m_errs); HX_RELEASE(pBuffer); } break; case XMLPDirective: { const char* pName = NULL; const char* pPublicID = NULL; const char* pSystemID = NULL; CHXBuffer* pBuffer = NULL; UINT32 ulNumAttributes = pTag->m_numAttributes; if(strcmp(pTag->m_name, "DOCTYPE") == 0 && ulNumAttributes > 0) { UINT32 ulCurAttribute = 0; while(ulCurAttribute < ulNumAttributes) { XMLAttribute* pAttr = NULL; if(ulCurAttribute == 0) { pAttr = pTag->attribute(ulCurAttribute); if(pAttr) { pName = pAttr->value; } } else { pAttr = pTag->attribute(ulCurAttribute); if(strcmp(pAttr->value, "SYSTEM") == 0) { ulCurAttribute++; if(ulCurAttribute < ulNumAttributes) { pAttr = pTag->attribute(ulCurAttribute); if(pAttr) { pSystemID = pAttr->value; } } } else if(strcmp(pAttr->value, "PUBLIC") == 0) { ulCurAttribute++; if(ulCurAttribute < ulNumAttributes) { pAttr = pTag->attribute(ulCurAttribute); if(pAttr) { pPublicID = pAttr->value; ulCurAttribute++; if(ulCurAttribute < ulNumAttributes) { pAttr = pTag->attribute(ulCurAttribute); if(pAttr) { pSystemID = pAttr->value; } } } } } } ulCurAttribute++; } rc = m_pResponse->HandleUnparsedDoctypeDecl(pName, pSystemID, pPublicID, ulTagStartLine,ulTagStartCol); HX_RELEASE(pBuffer); } } break; case XMLPProcInst: // handle processing instruction { const char* pTarget = pTag->m_name; CHXHeader* pValues = new CHXHeader; pValues->AddRef(); pValues->PreserveCase(TRUE); for(UINT32 i=0;i<pTag->m_numAttributes;++i) { XMLAttribute* pAttr = pTag->attribute(i); // the XMLParser class supports what it calls attributes // without names. It's used to communicate processing // instructions and things like that. We just ignore attributes // without names here. if (pAttr->name != NULL) { CHXBuffer* pBuf = new CHXBuffer; pBuf->AddRef(); pBuf->Set((const BYTE*)pAttr->value, strlen(pAttr->value)+1); pValues->SetPropertyCString( pAttr->name, pBuf); pBuf->Release(); } } rc = m_pResponse->HandleProcessingInstruction(pTarget, pValues,ulTagStartLine,ulTagStartCol); HandleErrors(pTag->m_errs); HX_RELEASE(pValues); } break; case XMLPTag: { const char* pName = pTag->m_name; if(pTag->m_type != XMLEndTag) { CHXHeader* pValues = new CHXHeader; pValues->AddRef(); pValues->PreserveCase(TRUE); for(UINT32 i=0;i<pTag->m_numAttributes;++i) { XMLAttribute* pAttr = pTag->attribute(i); // the XMLParser class supports what it calls attributes // without names. It's used to communicate processing // instructions and things like that. We just ignore attributes // without names here. if (pAttr->name != NULL) { CHXBuffer* pBuf = new CHXBuffer; pBuf->AddRef(); pBuf->Set((const BYTE*)pAttr->value, strlen(pAttr->value)+1); pValues->SetPropertyCString( pAttr->name, pBuf); pBuf->Release(); } } if(HXR_OK == rc) { rc = m_pResponse->HandleStartElement(pName, pValues,ulTagStartLine,ulTagStartCol); HandleErrors(pTag->m_errs); } HX_RELEASE(pValues); if(HXR_OK == rc && !pTag->m_need_close) { rc = m_pResponse->HandleEndElement(pName,ulTagStartLine,ulTagStartCol); } } else { rc = m_pResponse->HandleEndElement(pName,ulTagStartLine,ulTagStartCol); HandleErrors(pTag->m_errs); } } break; default: { bDone = TRUE; } break; } }exit: HX_DELETE(pTag); return rc;}HX_RESULTHXStrictXMLParser::GetCurrentLineNumber(REF(ULONG32) ulLineNumber){ HX_RESULT rc = HXR_OK; ulLineNumber = (UINT32)m_pParser->GetCurrentLineNumber(); return rc;}HX_RESULTHXStrictXMLParser::GetCurrentColumnNumber(REF(ULONG32) ulColumnNumber){ HX_RESULT rc = HXR_OK; ulColumnNumber = (UINT32)m_pParser->GetCurrentColumnNumber(); return rc;}HX_RESULTHXStrictXMLParser::GetCurrentByteIndex(REF(ULONG32) ulByteIndex){ HX_RESULT rc = HXR_NOTIMPL; return rc;}HX_RESULTHXStrictXMLParser::GetCurrentErrorText(REF(IHXBuffer*) pBuffer){ HX_RESULT rc = HXR_FAIL; XMLError* pLastError = m_pParser->GetLastError(); if(pLastError && pLastError->m_pErrorString) { pBuffer = new CHXBuffer; pBuffer->AddRef(); pBuffer->Set((BYTE*)pLastError->m_pErrorString, strlen(pLastError->m_pErrorString) + 1); rc = HXR_OK; } return rc;}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -