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 + -
显示快捷键?