sxml.cpp
来自「天之炼狱1服务器端源文件游戏服务端不完整」· C++ 代码 · 共 972 行 · 第 1/2 页
CPP
972 行
value = pAttr->ToInt(); return true;}const boolXMLTree::GetAttribute( const string& name, unsigned int &value, const bool bHex ){ const XMLAttribute *pAttr = GetAttribute( name ); if( pAttr == NULL ) return false; if( bHex == true ) value = pAttr->ToHex(); else value = pAttr->ToInt(); return true;}const boolXMLTree::GetAttribute( const string& name, DWORD &value, const bool bHex ){ const XMLAttribute *pAttr = GetAttribute( name ); if( pAttr == NULL ) return false; if( bHex == true ) value = pAttr->ToHex(); else value = pAttr->ToInt(); return true;}const boolXMLTree::GetAttribute( const string& name, float &value ){ const XMLAttribute *pAttr = GetAttribute( name ); if( pAttr == NULL ) return false; value = pAttr->ToFloat(); return true;}const boolXMLTree::GetAttribute( const string& name, double &value ){ const XMLAttribute *pAttr = GetAttribute( name ); if( pAttr == NULL ) return false; value = pAttr->ToDouble(); return true;}const boolXMLTree::GetAttribute( const string& name, bool &value ){ const XMLAttribute *pAttr = GetAttribute( name ); if( pAttr == NULL ) return false; value = pAttr->ToBool(); return true;}XMLTree*XMLTree::AddChild( const string& name ){ CHILDREN_MAP::iterator itr = m_ChildrenMap.find( name ); XMLTree *pTree = new XMLTree( name ); pTree->SetParent( this ); m_ChildrenVector.push_back( pTree ); if ( itr == m_ChildrenMap.end() ) { m_ChildrenMap.insert( CHILDREN_MAP::value_type( name, pTree ) ); } return pTree;}XMLTree*XMLTree::AddChild( XMLTree* pChild ){ pChild->SetParent( this ); m_ChildrenVector.push_back( pChild ); m_ChildrenMap[pChild->GetName()] = pChild; return pChild;}XMLTree*XMLTree::GetChild( const string& name ) const{ CHILDREN_MAP::const_iterator itr = m_ChildrenMap.find( name ); if ( itr == m_ChildrenMap.end() ) return NULL; return itr->second;}XMLTree*XMLTree::GetChild( size_t index ) const{ return ( ( index < m_ChildrenVector.size() ) ? m_ChildrenVector[index] : NULL );}const size_tXMLTree::GetChildCount() const{ return m_ChildrenVector.size();}void XMLTree::Release(){ ATTRIBUTES_MAP::iterator itr = m_AttributesMap.begin(); ATTRIBUTES_MAP::iterator endItr = m_AttributesMap.end(); while(itr != endItr) { delete itr->second; itr++; } m_AttributesMap.clear(); m_AttributesVector.clear(); CHILDREN_MAP::iterator itr2 = m_ChildrenMap.begin(); CHILDREN_MAP::iterator endItr2 = m_ChildrenMap.end(); while(itr2 != endItr2) { delete itr2->second; itr2++; } m_ChildrenMap.clear(); m_ChildrenVector.clear();}voidXMLTree::LoadFromFile( const char *pFilename ){ XMLParser parser( this ); parser.parseURL( pFilename );}voidXMLTree::LoadFromMem( const char *pBuffer ){ XMLParser parser( this ); parser.parse( pBuffer );}voidXMLTree::SaveToFile( const char* pFilename ){ ofstream file( pFilename, ios::out | ios::trunc ); if ( file == NULL ) return; file << "<?xml version=\"1.0\" encoding=\"UTF-8\"?>" << endl; Save(file, 0);}voidXMLTree::Save( ofstream& file, size_t indent ){ for ( size_t i = 0; i < indent; i++ ) file << "\t"; file << "<" << m_Name; ATTRIBUTES_VECTOR::iterator itr = m_AttributesVector.begin(); ATTRIBUTES_VECTOR::iterator endItr = m_AttributesVector.end(); while( itr != endItr) { file << " " << (*itr)->GetName() << "='" << (*itr)->ToString() << "'"; itr++; } if (m_ChildrenVector.empty() == true && GetText().empty() == true) { file << "/>" << endl; } else { file << ">" << GetText(); if(m_ChildrenVector.empty() == true) { file << "</" << m_Name << ">" << endl; } else { file << endl; CHILDREN_VECTOR::iterator itr = m_ChildrenVector.begin(); CHILDREN_VECTOR::iterator endItr = m_ChildrenVector.end(); while( itr != endItr) { (*itr)->Save( file, indent + 1 ); itr++; } for ( size_t i = 0; i < indent; i++ ) file << "\t"; file << "</" << m_Name << ">" << endl; } }}////////////////////////////////////////////////////////////////////////////////// XMLTreeGenerator////////////////////////////////////////////////////////////////////////////////XMLTreeGenerator::XMLTreeGenerator( XMLTree* pTree ): m_pRoot(pTree), m_pBuffer(NULL){}XMLTreeGenerator::~XMLTreeGenerator(){}voidXMLTreeGenerator::startElement( const XMLCh* const uri, const XMLCh* const localname, const XMLCh* const qname, const Attributes& attrs){ string name = XMLUtil::trim( XMLUtil::WideCharToString( localname ) ); if ( name.empty() ) return; XMLTree* pTree = NULL; if ( m_pBuffer == NULL ) { m_pRoot->SetName( name ); pTree = m_pRoot; } else { pTree = m_pBuffer->AddChild( name ); } for ( unsigned int i = 0; i < attrs.getLength(); i++ ) { pTree->AddAttribute( XMLUtil::trim( XMLUtil::WideCharToString( attrs.getLocalName( i ) ) ), XMLUtil::trim( XMLUtil::WideCharToString( attrs.getValue( i ) ) ) ); } m_pBuffer = pTree;}voidXMLTreeGenerator::endElement( const XMLCh* const uri, const XMLCh* const localname, const XMLCh* const qname ){ assert( m_pBuffer != NULL ); m_pBuffer = const_cast<XMLTree *>(m_pBuffer->GetParent());}voidXMLTreeGenerator::characters( const XMLCh* const chars, const unsigned int length ){ assert( m_pBuffer != NULL ); string text = XMLUtil::trim( XMLUtil::WideCharToString( chars ) ); m_pBuffer->SetText( m_pBuffer->GetText() + text );}///////////////////////////////////////////////////////////////////////////////// \brief //////////////////////////////////////////////////////////////////////////////void XMLTreeGenerator::resetDocument(){ m_pRoot->Release();}///////////////////////////////////////////////////////////////////////////////// \brief /// \param e //////////////////////////////////////////////////////////////////////////////void XMLTreeGenerator::warning(const SAXParseException& e){ XMLUtil::filelog( "\nWarning at FILE %s, LINE %d, CHAR %d, \nMessage: %s\n", XMLUtil::WideCharToString(e.getSystemId()).c_str(), e.getLineNumber(), e.getColumnNumber(), XMLUtil::WideCharToString(e.getMessage()).c_str()); assert(false);}///////////////////////////////////////////////////////////////////////////////// \brief /// \param e //////////////////////////////////////////////////////////////////////////////void XMLTreeGenerator::error(const SAXParseException& e){ XMLUtil::filelog( "\nError at FILE %s, LINE %d, CHAR %d, \nMessage: %s\n", XMLUtil::WideCharToString(e.getSystemId()).c_str(), e.getLineNumber(), e.getColumnNumber(), XMLUtil::WideCharToString(e.getMessage()).c_str()); assert(false);}///////////////////////////////////////////////////////////////////////////////// \brief /// \param e //////////////////////////////////////////////////////////////////////////////void XMLTreeGenerator::fatalError(const SAXParseException& e){ XMLUtil::filelog( "\nFatal error at FILE %s, LINE %d, CHAR %d, \nMessage: %s\n", XMLUtil::WideCharToString(e.getSystemId()).c_str(), e.getLineNumber(), e.getColumnNumber(), XMLUtil::WideCharToString(e.getMessage()).c_str()); assert(false);}///////////////////////////////////////////////////////////////////////////////// \brief /// \param pTree //////////////////////////////////////////////////////////////////////////////XMLParser::XMLParser(XMLTree* pTree){ try // Initialize the XML4C2 system { XMLPlatformUtils::Initialize(); } catch (const XMLException& toCatch) { XMLUtil::filelog( "Error during initialization! Message:%s\n", XMLUtil::WideCharToString(toCatch.getMessage()).c_str()); } m_pHandler = new XMLTreeGenerator(pTree);}///////////////////////////////////////////////////////////////////////////////// \brief //////////////////////////////////////////////////////////////////////////////XMLParser::~XMLParser(){ if (m_pHandler != NULL) delete m_pHandler; // And call the termination method XMLPlatformUtils::Terminate();}///////////////////////////////////////////////////////////////////////////////// \brief 瘤沥等 困摹俊 乐绰 颇老 肚绰 昆 巩辑甫 颇教茄促./// /// \param pURL //////////////////////////////////////////////////////////////////////////////void XMLParser::parseURL(const char* pURL){ assert(pURL != NULL); assert(m_pHandler != NULL); // SAX 颇辑 坷宏璃飘甫 积己茄促. 弊府绊 feature甫 汲沥茄促. // SAX2俊辑 瘤盔登绰 feature绰 促澜苞 鞍促. // // validation (default: true) // namespaces (default: true) // namespace-prefixes (default: false) // validation/dynamic (default: false) // reuse-grammar (default: false) // schema (default: true) // schema-full-checking (default: false) // load-external-dtd (default: true) // continue-after-fatal-error (default: false) // validation-error-as-fatal (default: false) // // 磊技茄 荤亲篮 促澜 林家甫 曼绊窍扁 官鄂促. // http://xml.apache.org/xerces-c/program-sax2.html#SAX2Features SAX2XMLReader* pParser = XMLReaderFactory::createXMLReader(); pParser->setFeature(XMLUni::fgSAX2CoreNameSpaces, true); pParser->setFeature(XMLUni::fgXercesSchema, true); pParser->setFeature(XMLUni::fgXercesSchemaFullChecking, false); pParser->setFeature(XMLUni::fgSAX2CoreNameSpacePrefixes, false); pParser->setFeature(XMLUni::fgSAX2CoreValidation, true); pParser->setFeature(XMLUni::fgXercesDynamic, true); pParser->setContentHandler(m_pHandler); pParser->setErrorHandler(m_pHandler); try { pParser->parse(pURL); } catch (const XMLException& e) { XMLUtil::filelog( "\nError during parsing! Exception Message: \n%s\n", XMLUtil::WideCharToString(e.getMessage()).c_str()); } catch (...) { XMLUtil::filelog( "Unexpected exception during parsing!\n"); } delete pParser;}///////////////////////////////////////////////////////////////////////////////// \brief 牢荐肺 逞败瘤绰 巩磊凯阑 XML 巩辑肺 啊沥窍绊 颇教茄促./// /// \param buffer //////////////////////////////////////////////////////////////////////////////void XMLParser::parse(const char* buffer){ assert(buffer != NULL); assert(m_pHandler != NULL); // SAX 颇辑 坷宏璃飘甫 积己茄促. 弊府绊 feature甫 汲沥茄促. // feature俊 包茄 荤亲篮 XMLParser::parseURL() 窃荐甫 曼绊窍扁 官鄂促. SAX2XMLReader* pParser = XMLReaderFactory::createXMLReader(); pParser->setFeature(XMLUni::fgSAX2CoreNameSpaces, true); pParser->setFeature(XMLUni::fgXercesSchema, true); pParser->setFeature(XMLUni::fgXercesSchemaFullChecking, false); pParser->setFeature(XMLUni::fgSAX2CoreNameSpacePrefixes, false); pParser->setFeature(XMLUni::fgSAX2CoreValidation, true); pParser->setFeature(XMLUni::fgXercesDynamic, true); pParser->setContentHandler(m_pHandler); pParser->setErrorHandler(m_pHandler); try { MemBufInputSource source( (const XMLByte*)(buffer), (unsigned int)strlen(buffer), "", false); pParser->parse(source); } catch (const XMLException& e) { XMLUtil::filelog( "\nError during parsing! Exception Message: \n%s\n", XMLUtil::WideCharToString(e.getMessage()).c_str()); } catch (...) { XMLUtil::filelog( "Unexpected exception during parsing!\n"); } delete pParser;}
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?