Xerces输出中文
Xerces内部用XMLCh类型表示字符。根据宏定义这个类型可以是char或wchar型。
Xerces提供了XMLString类对字符串进行操作。
提供了XMLString::transcode对 char* 与 XMLCh* 之间的转换。
注意:调用XMLString::transcode后,要对返回值指针用XMLString::release进行释放,以免产生内存泄漏。所以封装下面的类简化应用程序的操作。
class XStr
{
public :
// -----------------------------------------------------------------------
// Constructors and Destructor
// -----------------------------------------------------------------------
XStr(const char* const toTranscode)
{
// Call the private transcoding method
fUnicodeForm = XMLString::transcode(toTranscode);
}
~XStr()
{
XMLString::release(&fUnicodeForm);
}
const XMLCh * trim()
{
XMLString::trim(fUnicodeForm);
return fUnicodeForm;
}
// -----------------------------------------------------------------------
// Getter methods
// -----------------------------------------------------------------------
operator const XMLCh* () const
{
return fUnicodeForm;
}
private :
// -----------------------------------------------------------------------
// Private data members
//
// fUnicodeForm
// This is the Unicode XMLCh format of the string.
// -----------------------------------------------------------------------
XMLCh* fUnicodeForm;
};
class StrX
{
public :
// -----------------------------------------------------------------------
// Constructors and Destructor
// -----------------------------------------------------------------------
StrX(const XMLCh* const toTranscode)
{
// Call the private transcoding method
fLocalForm = XMLString::transcode(toTranscode);
}
~StrX()
{
XMLString::release(&fLocalForm);
}
const char * trim()
{
XMLString::trim(fLocalForm);
return fLocalForm;
}
// -----------------------------------------------------------------------
// Getter methods
// -----------------------------------------------------------------------
operator const char* () const
{
return fLocalForm;
}
operator const INT32() const
{
return atoi(fLocalForm);
}
private :
// -----------------------------------------------------------------------
// Private data members
//
// fLocalForm
// This is the local code page form of the string.
// -----------------------------------------------------------------------
char* fLocalForm;
};
Xerces 支持国际化。它通过DOMLSSerializer、DOMLSOutput完成国际化操作
DOMLSOutput提供setEncoding设置字符集。类关系如下图:
例子:
#define LOG_ERROR printf
#define ACE_TEXT
intSendNotify(int nRet, char* pszErr)
{
char buf[MAX_PATH];
std::string szXml;
DOMImplementation * impl = DOMImplementationRegistry::getDOMImplementation(NULL/*XStr("core")*/);
if(NULL == impl)
{
LOG_ERROR(ACE_TEXT("getDOMImplementation fail\n"));
return -1;
} // 结束if(NULL == impl)
try
{
DOMLSSerializer * ser = NULL;
DOMDocument* doc = NULL;
DOMLSOutput* output = NULL;
MemBufFormatTarget target;
do
{
ser = ((DOMImplementationLS*)impl)->createLSSerializer();
if(NULL == ser)
{
break;
} // 结束if(0 == nC)
output = ((DOMImplementationLS*)impl)->createLSOutput();
if(NULL == output)
break;
output->setEncoding(XStr("UTF-8")/*XStr("gb2312")*/);
output->setByteStream(&target);
doc = impl->createDocument(
0, // root element namespace URI.
XStr("ReponseMsg"), // root element name
0); // document type object (DTD).
if(!doc)
{
LOG_ERROR(ACE_TEXT("createDocument ReponseMsg error\n"));
break;
} // 结束if(!doc)
DOMElement * rootElem = doc->getDocumentElement();
if(!rootElem)
{
LOG_ERROR(ACE_TEXT("getDocumentElement error\n"));
break;
} // 结束if(!rootElem)
DOMElement * headElem = doc->createElement(XStr("MsgHead"));
if(!headElem)
{
LOG_ERROR(ACE_TEXT("createElement MsgHead error\n"));
break;
} // 结束if(!headElem)
rootElem->appendChild(headElem);
DOMElement * msgCodeElem = doc->createElement(XStr("MsgCode"));
if(!headElem)
{
LOG_ERROR(ACE_TEXT("createElement MsgCode error\n"));
break;
} // 结束if(!headElem)
headElem->appendChild(msgCodeElem);
DOMText* text = doc->createTextNode(XStr("91061"));
if(!text)
{
LOG_ERROR(ACE_TEXT("createTextNode msgcode error\n"));
break;
}
msgCodeElem->appendChild(text);
DOMElement * passkeyElem = doc->createElement(XStr("PassKey"));
if(!passkeyElem)
{
LOG_ERROR(ACE_TEXT("createElement passkey error\n"));
break;
}
headElem->appendChild(passkeyElem);
text = doc->createTextNode(XStr(m_Request.szPassKey.c_str()));
if(!text)
{
LOG_ERROR(ACE_TEXT("createTextNode passkey error\n"));
break;
}
passkeyElem->appendChild(text);
DOMElement * bodyElem = doc->createElement(XStr("MsgBody"));
if(!bodyElem)
{
LOG_ERROR(ACE_TEXT("createElement msgbody error\n"));
break;
}
rootElem->appendChild(bodyElem);
DOMElement * reqElem = doc->createElement(XStr("TCTaskOverReq"));
if(!reqElem)
{
LOG_ERROR(ACE_TEXT("createElement TCTaskOverReq error\n"));
break;
}
bodyElem->appendChild(reqElem);
DOMElement * taskidElem = doc->createElement(XStr("TaskID"));
if(!taskidElem)
{
LOG_ERROR(ACE_TEXT("createElement taskid error\n"));
break;
}
reqElem->appendChild(taskidElem);
text = doc->createTextNode(XStr(m_Request.szTaskId.c_str()));
if(!text)
{
LOG_ERROR(ACE_TEXT("createTextNode taskid error\n"));
break;
}
taskidElem->appendChild(text);
DOMElement* statusElem = doc->createElement(XStr("Status"));
if(!statusElem)
{
LOG_ERROR(ACE_TEXT("createElement statusElem error\n"));
break;
}
reqElem->appendChild(statusElem);
text = doc->createTextNode(XStr(itoa(nRet, buf, 10)));
if(!text)
{
LOG_ERROR(ACE_TEXT("createTextNode status error\n"));
break;
}
statusElem->appendChild(text);
DOMElement * reasonElem = doc->createElement(XStr("Reason"));
if(!reasonElem)
{
LOG_ERROR(ACE_TEXT("createElement statusElem error\n"));
break;
}
reqElem->appendChild(reasonElem);
if(pszErr)
{
text = doc->createTextNode(XStr(pszErr));
if(!text)
{
LOG_ERROR(ACE_TEXT("createTextNode status error\n"));
break;
}
reasonElem->appendChild(text);
} // 结束if(pszErr)
}while(0);
ser->write(doc, output);
szXml = (char*)target.getRawBuffer();
if(doc)
doc->release();
if(output)
output->release();
if(ser)
ser->release();
}
catch (DOMException& e)
{
return 0;
}
LOG_DEBUG("notify:%s\n", szXml.c_str());
}