Xerces国际化操作

 

Xerces输出中文

 

Xerces内部用XMLCh类型表示字符。根据宏定义这个类型可以是charwchar型。

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());

}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值