国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學院 > 開發設計 > 正文

如何利用Xerces C++正確處理XML文檔中的中文

2019-11-17 05:33:32
字體:
來源:轉載
供稿:網友
下載本文示例代碼

1. 背景介紹

Apache的Xerces C++是廣大c/c++程序員非常喜歡使用的xml解析器之一。主要原因是其本身是一個開放源代碼的項目而且提供不同平臺下的庫和源代碼,故深受廣大c/c++程序員的歡迎。

Xerces C++可以到以下網站下載:
1) http://xml.apache.org/
2) http://www.vckbase.com/tools 2. 問題描述

根據軟件開發的要求,作者開發了一個文件特征識別軟件,該軟件可根據文件特有的特征識別出文件的類型。要求將文件特征保存在XML文件中。根據要求作者選擇了Xerces C++作為XML解析器。但發現出了一個嚴重的問題:被解析的XML文件中不能包含中文,否則中文將不能正確的解析。作者研究了Xerces C++提供的例子程序,發現這些例子程序解析的結果也是錯誤的。只有DOMPRint程序例外。這肯定了Xerces C++本身是支持中文的。
XML編碼:<pdf ext="pdf" description="pdf文檔"> <magic offset="0" type="string" value="/x25/x50/x44/x46" /> </pdf>SAXPrint程序解析結果:<pdf ext="pdf" description="pdf文档"> <magic offset="0" type="string" value="/x25/x50/x44/x46"></magic></pdf> 為此,作者曾經在IBM的中文網站發現一篇文章《如何利用Xerces-C++解析包含中文字符的XML文檔》并將其所描述的辦法應用到程序中。但后來由于機器發生故障,硬盤上的數據全部丟失。不得不把以前做過的事重做一遍。因一時在IBM的網站上未找到上面提到的貼子,而且由于當時撿現成的沒有專心研究其實現方法,故不得不仔細分析Xerces C++提供的源代碼,自己動手解決中文問題。為了今后廣大C++程序員碰到類似問題時不會像我一樣痛苦。我也決定將自己的研究結果公布出來供大家分享。假如誰有更好的解決辦法不要忘記告訴我。

3. 原因分析

上面的例子里,程序將“文檔”兩個中文字符解析成了亂碼。但DOMPrint程序確能夠正確解析。這表明Xerces C++對國際編碼肯定是支持的。作者通過對DOMPrint和SAXPrint兩個程序的比較跟蹤發現問題的根本就是XMLFormatter設置的問題。由于SAX是基于事件的,大多數使用者只是簡單的解析XML文檔,XMLFormatter的使用比較麻煩。而DOMPrint也是通過標準的輸出程序輸出的屏幕上的,我們不能直接使用輸出結果。
由于XML解析器解析的字符串都是XMLCh格式的,一個字符占用一個字節,而漢字字符確要占用兩個字節。故若不做適當的轉換,漢字的輸出結果就變成亂碼了。

4. 解決辦法

找到原因就有解決問題的方法了,明顯的需要一個把解析出來的XMLCh轉換成普通的字符串。這是解析,假如我們需要自己寫入XML文檔也有一個把普通字符串轉換為XMLCh的過程。我把這兩個轉換過程封裝在了一個名為“XMLStringTranslate”的類中。使用如下:
void SAXMagicHandlers::startElement(const XMLCh* const name,AttributeList& attributes){ XMLStringTranslate stringTranslate("gb2312"); string strName=stringTranslate.translate(name);//得到可包含漢字字符的普通字符串 string strValue="pdf文檔"; XMLCh * value= stringTranslate.translate(strValue.c_str());//將普通字符串轉換成XMLCh串}采用XMLStringTranslate后的實際運行結果:<pdf ext="pdf" description="pdf文檔"> <magic offset="0" type="string" value="/x25/x50/x44/x46"></magic></pdf> 非凡說明:
由于為了防止內存釋放問題,將普通字符串轉換成XMLCh *的translate函數返回的是類的一個成員變量,故下面的代碼是不答應的:XMLCh * value1= stringTranslate.translate("測試1");XMLCh * value2= stringTranslate.translate("測試2"); 這樣使用的結果是value1和value2的值將是一樣的(因為其內存地址根本就是一樣的)。正確的使用方法是通過內存拷貝或則其他方法,將value1的值保存起來或則及時使用,否則value2將影響value1的值。


5. 結束語

目前,許多企業已經或者正在采用Xerces C++開發XML的應用系統,相信在應用的過程中會碰到各種問題,歡迎有愛好的朋友與我聯系,共同交流。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 东莞市| 南木林县| 浦江县| 扎赉特旗| 本溪市| 南漳县| 巨鹿县| 白山市| 仪陇县| 卫辉市| 甘南县| 汪清县| 绥棱县| 浙江省| 敖汉旗| 邯郸市| 阿图什市| 页游| 蕉岭县| 铜山县| 塔城市| 松原市| 北安市| 巴塘县| 太原市| 连城县| 彭州市| 南投县| 时尚| 阿克陶县| 麻江县| 上饶市| 赣州市| 五峰| 合水县| 曲阜市| 汉川市| 三门峡市| 同德县| 安福县| 黔江区|