sxml.cpp
来自「天之炼狱1服务器端源文件游戏服务端不完整」· C++ 代码 · 共 972 行 · 第 1/2 页
CPP
972 行
///////////////////////////////////////////////////////////////////////////////// \file XML.cpp/// \author excel96/// \date 2003.7.25////// \todo/// \bug/// \warning////////////////////////////////////////////////////////////////////////////////#include "SFCPCH.h"#include "SXml.h"#include <iostream>#include <iosfwd>#include <assert.h>#include <cstdio>#include <cstdarg>#include <ctime>void itoa( int value, char* buf, int r ){ if ( r == 10 ) { sprintf(buf, "%d", value); } else { sprintf(buf, "%x", value); }}//using namespace std;//#pragma warning (push, 1) #include "xercesc/sax/SAXParseException.hpp" #include "xercesc/sax/SAXException.hpp" #include "xercesc/framework/MemBufInputSource.hpp" #include "xercesc/util/PlatformUtils.hpp" #include "xercesc/util/XMLString.hpp" #include "xercesc/sax2/XMLReaderFactory.hpp" #include "xercesc/sax2/SAX2XMLReader.hpp" #include "xercesc/sax2/Attributes.hpp" #include "xercesc/sax2/DefaultHandler.hpp"//#pragma warning (pop)//#pragma warning(disable:4100)XERCES_CPP_NAMESPACE_USE///////////////////////////////////////////////////////////////////////////////// \class XMLUtil/// \brief//////////////////////////////////////////////////////////////////////////////class XMLUtil{public: static string trim(const string& str); static void filelog(char* fmt, ...); static string WideCharToString(const XMLCh * wstr, int wstrlen = -1);};///////////////////////////////////////////////////////////////////////////////// \class StrX/// \brief //////////////////////////////////////////////////////////////////////////////class StrX{private: char* m_pCSTR; ///< 郴何 巩磊凯 滚欺public: StrX(const XMLCh* const toTranscode) { m_pCSTR = XMLString::transcode(toTranscode); } ~StrX() { XMLString::release(&m_pCSTR); } const char* c_str() const { return m_pCSTR; } string toString() const { return m_pCSTR; }};///////////////////////////////////////////////////////////////////////////////// \class XMLTreeGenerator/// \brief //////////////////////////////////////////////////////////////////////////////class XMLTreeGenerator : public DefaultHandler{private: XMLTree* m_pRoot; ///< 弥惑困 畴靛 XMLTree* m_pBuffer; ///< XML 颇教侩 烙矫 畴靛public: XMLTreeGenerator( XMLTree* pTree ); virtual ~XMLTreeGenerator();public: // Handlers for the SAX ContentHandler interface void startElement( const XMLCh* const uri, const XMLCh* const localname, const XMLCh* const qname, const Attributes& attrs ); void endElement( const XMLCh* const uri, const XMLCh* const localname, const XMLCh* const qname ); void characters( const XMLCh* const chars, const unsigned int length ); void ignorableWhitespace( const XMLCh* const, const unsigned int ) {} void resetDocument(); // Handlers for the SAX ErrorHandler interface void warning( const SAXParseException& e ); void error( const SAXParseException& e ); void fatalError( const SAXParseException& e );private: XMLTreeGenerator( const XMLTreeGenerator& ) {} XMLTreeGenerator& operator = ( const XMLTreeGenerator& ) { return *this; }};///////////////////////////////////////////////////////////////////////////////// \class XMLParser/// \brief //////////////////////////////////////////////////////////////////////////////class XMLParser{private: DefaultHandler* m_pHandler;public: XMLParser(XMLTree* pTree); virtual ~XMLParser();public: /// \brief 瘤沥等 困摹俊 乐绰 颇老 肚绰 昆 巩辑甫 颇教茄促. void parseURL(const char* pURL); /// \brief 牢荐肺 逞败瘤绰 巩磊凯阑 XML 巩辑肺 啊沥窍绊 颇教茄促. void parse(const char* buffer);};static const char* XML_ERROR_FILENAME = "__XMLError.log";///////////////////////////////////////////////////////////////////////////////// \brief /// \param str /// \return string //////////////////////////////////////////////////////////////////////////////string XMLUtil::WideCharToString(const XMLCh * wstr, int wstrlen){// return StrX( wstr ).c_str();/* if ( wstrlen == -1 ) { wstrlen = (int)wcslen(wstr); }*/ // test korean with WideCharToMultiByte // int WideCharToMultiByte( // UINT CodePage, // code page // DWORD dwFlags, // performance and mapping flags // LPCWSTR lpWideCharStr, // wide-character string // int cchWideChar, // number of chars in string // LPSTR lpMultiByteStr, // buffer for new string // int cbMultiByte, // size of buffer // LPCSTR lpDefaultChar, // default for unmappable chars // LPBOOL lpUsedDefaultChar // set when default char used // ); // //lpDefaultChar // [in] Points to the character used if a wide character cannot be represented in the specified code page. // If this parameter is NULL, a system default value is used. // The function is faster when both lpDefaultChar and lpUsedDefaultChar are NULL. // For the code pages mentioned in dwFlags, lpDefaultChar must be NULL, // otherwise the function fails with ERROR_INVALID_PARAMETER. // lpUsedDefaultChar // [in] Points to a flag that indicates whether a default character was used. // The flag is set to TRUE if one or more wide characters in the source string // cannot be represented in the specified code page. Otherwise, the flag is set to FALSE. // This parameter may be NULL. The function is faster when both lpDefaultChar and lpUsedDefaultChar are NULL. // For the code pages mentioned in dwFlags, lpUsedDefaultChar must be NULL, // otherwise the function fails with ERROR_INVALID_PARAMETER. // 弥家茄狼 汗荤甫 临捞扁 困秦辑 胶飘傅阑 霖厚. /* string strBuffer; strBuffer.reserve( wstrlen * 2 + 1 ); // capacity 甫 面盒窍霸.. int nCopied = WideCharToMultiByte( CP_OEMCP, WC_COMPOSITECHECK, wstr, // wide string wstrlen, // length of wide string const_cast<LPSTR>(strBuffer.data()), // mbcs string (unicode) (int)strBuffer.capacity(), // length of mbcs string NULL, // NULL 捞 狐福促绰单? NULL ); strBuffer[nCopied] = 0; strBuffer._Mysize = nCopied; // 荐悼栏肺 瘤沥秦具 茄促. return strBuffer;*/ return StrX(wstr).toString();}string XMLUtil::trim(const string& str){ if (str.size() == 0) return ""; static const char * WhiteSpaces = " \t\n\r"; size_t begin = str.find_first_not_of(WhiteSpaces); size_t end = str.find_last_not_of(WhiteSpaces); if (begin == string::npos) { if (end == string::npos) return ""; else begin = 0; } else if (end == string::npos) { end = str.size(); } return str.substr(begin , end - begin + 1);}///////////////////////////////////////////////////////////////////////////////// \brief /// \param fmt /// \param ... //////////////////////////////////////////////////////////////////////////////void XMLUtil::filelog(char* fmt, ...){ ofstream file(XML_ERROR_FILENAME, ios::out | ios::app); if (file.is_open()) { va_list valist; va_start(valist, fmt); char message_buffer[30000] = {0, }; int nchars = vsnprintf(message_buffer, 30000, fmt, valist); if (nchars == -1 || nchars > 30000) { filelog(NULL, "filelog buffer overflow!"); throw ("filelog() : more buffer size needed for log"); } va_end(valist); time_t now = time(0); char time_buffer[256] = {0, }; sprintf(time_buffer, "%s : ", ctime(&now)); file.write(time_buffer, (streamsize)strlen(time_buffer)); file.write(message_buffer, (streamsize)strlen(message_buffer)); file.write("\n", (streamsize)strlen("\n")); }}////////////////////////////////////////////////////////////////////////////////// XMLAttribute////////////////////////////////////////////////////////////////////////////////XMLAttribute::XMLAttribute( const string &name, const string &value ): m_Name( name ), m_Value( value ){}XMLAttribute::~XMLAttribute(){}voidXMLAttribute::SetValue( string value ){ m_Value = value;}const char*XMLAttribute::GetName() const{ return m_Name.c_str();}const char*XMLAttribute::ToString() const{ return m_Value.c_str();}const intXMLAttribute::ToInt() const{ return atoi( m_Value.c_str() );}const DWORDXMLAttribute::ToHex() const{ return strtoul( m_Value.c_str(), NULL, 16 );}const boolXMLAttribute::ToBool() const{ return ( m_Value == "true" || m_Value == "TRUE" ) ? true : false;}const double XMLAttribute::ToDouble() const{ return atof( m_Value.c_str() );}const floatXMLAttribute::ToFloat() const{ return (float)atof( m_Value.c_str() );}////////////////////////////////////////////////////////////////////////////////// XMLTree////////////////////////////////////////////////////////////////////////////////XMLTree::XMLTree(): m_pParent( NULL ){}XMLTree::XMLTree( const string& name ): m_Name( name ), m_pParent( NULL ){}XMLTree::~XMLTree(){ Release();}const string&XMLTree::GetName() const{ return m_Name;}voidXMLTree::SetName( const string& name ){ m_Name = name;}const string&XMLTree::GetText() const{ return m_Text;}voidXMLTree::SetText( const string& text ){ m_Text = text;}const XMLTree*XMLTree::GetParent() const{ return m_pParent;}voidXMLTree::SetParent( XMLTree* pParent ){ m_pParent = pParent;}void XMLTree::AddAttribute( const string& name, const string& value ){ ATTRIBUTES_MAP::iterator itr = m_AttributesMap.find( name ); if ( itr == m_AttributesMap.end() ) { XMLAttribute *pAttr = new XMLAttribute( name, value ); m_AttributesVector.push_back( pAttr ); m_AttributesMap.insert( ATTRIBUTES_MAP::value_type( name, pAttr ) ); } else { XMLAttribute *pAttr = itr->second; pAttr->SetValue( value ); }}void XMLTree::AddAttribute( const string& name, const char *value ){ AddAttribute( name, string(value) );}void XMLTree::AddAttribute( const string& name, const int& value ){ char szTemp[20]; itoa( value, szTemp, 10 ); AddAttribute( name, string(szTemp) );}void XMLTree::AddAttribute( const string& name, const unsigned int& value, const bool bHex ){ char szTemp[20]; if( bHex == true ) itoa( value, szTemp, 16 ); else itoa( value, szTemp, 10 ); AddAttribute( name, string(szTemp) );}void XMLTree::AddAttribute( const string& name, const DWORD& value, const bool bHex ){ char szTemp[20]; if( bHex == true ) itoa( value, szTemp, 16 ); else itoa( value, szTemp, 10 ); AddAttribute( name, string(szTemp) );}void XMLTree::AddAttribute( const string& name, const float& value ){ char szTemp[512]; sprintf( szTemp, "%f", value ); AddAttribute( name, string(szTemp) );}void XMLTree::AddAttribute( const string& name, const double& value ){ char szTemp[512]; sprintf( szTemp, "%f", value ); AddAttribute( name, string(szTemp) );}void XMLTree::AddAttribute( const string& name, const bool& value ){ if( value == true ) AddAttribute( name, string("true") ); else AddAttribute( name, string("false") );}XMLAttribute *XMLTree::GetAttribute( const string& name ) const{ if(m_AttributesMap.empty() == true) return NULL; ATTRIBUTES_MAP::const_iterator itr = m_AttributesMap.find( name ); if( itr == m_AttributesMap.end() ) return NULL; return itr->second;}const boolXMLTree::GetAttribute( const string& name, string &value ){ const XMLAttribute *pAttr = GetAttribute( name ); if( pAttr == NULL ) return false; value = pAttr->ToString(); return true;}const boolXMLTree::GetAttribute( const string& name, int &value ){ const XMLAttribute *pAttr = GetAttribute( name ); if( pAttr == NULL ) return false;
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?