tinyxml 读取文本节点_在Windows下使用TinyXML-2读取UTF-8编码包含中文字符的XML文件...
TinyXML-2 是一個用 C++ 開發的小巧、高效的 XML 解析工具,它在 GitHub 網站上的鏈接為:
https://github.com/leethomason/tinyxml2 。它的結構非常精簡,僅由 tinyxml2.h 和 tinyxml2.cpp 兩個文件組成。TinyXML-2 能夠處理 UTF-8 編碼方式的 XML 文件,而 Windows 操作系統使用的文字編碼方式是 UTF-16,所以如果在 Windows 平臺上使用 TinyXML-2,應當留意編碼方式的差異,有時需要進行編碼轉換。
這里舉一個簡單例子:在簡體中文版 Windows 7 平臺上,要使用 TinyXML-2 處理一個包含中文字符、UTF-8 編碼的 XML 文件,該文件名為 Example.xml,內容如下:
電路板&1號
http://amazon.com
現在要讀取元素節點 circuit_board 中包含的文本節點(其實就是“電路板&1號”),示例程序如下:
/**************************************************
* Author: HAN Wei
* Author's blog: http://blog.csdn.net/henter/
* Date: April 17th, 2017
* Description: demonstrate how to read XML content
including Chinese characters by using TinyXML-2
**************************************************/
#include "Windows.h"
#include "tinyxml2.h"
#include
using namespace std;
int main(void)
{
char file_name[256] = {"Example.xml"};
wchar_t *buffer;
int buffer_len;
tinyxml2::XMLDocument doc;
tinyxml2::XMLText* CircuitBoardTextNode;
_wsetlocale(LC_ALL, L"chs");
doc.LoadFile(file_name);
if ( doc.ErrorID() )
{
wprintf(L"加載配置文件出錯!\n");
system("pause");
return (-1);
}
doc.Print();
CircuitBoardTextNode = doc.FirstChildElement("material_list")->FirstChildElement("circuit_board")->FirstChild()->ToText();
const char* CircuitBoardName = CircuitBoardTextNode->Value();
if ( !(buffer_len = MultiByteToWideChar(CP_UTF8, 0, CircuitBoardName, -1, NULL, 0)) )
{
wprintf(L"編碼轉換錯誤!\n");
system("pause");
return (-1);
}
buffer = new wchar_t[buffer_len];
if ( !(MultiByteToWideChar(CP_UTF8, 0, CircuitBoardName, -1, buffer, buffer_len)) )
{
wprintf(L"編碼轉換錯誤!\n");
system("pause");
return (-1);
}
wprintf(L"\n%ls\n\n", buffer);
delete [] buffer;
system("pause");
return 0;
}
使用Visual Studio編譯并執行這個程序,輸出結果如下:
從輸出結果可以看出:
1. 使用 TinyXML-2 從 XML 中讀取內容時,會將讀出的字符串以 char 數組形式存儲。在中文版 Windows 操作系統中,使用 tinyxml2::XMLDocument 類的 Print( ) 方法輸出 XML 文件的內容時,如果輸出內容是可顯示的 ASCII 字符,不會有任何問題;如果輸出內容是 UTF-8 編碼的中文字符,則會顯示亂碼。
2. 為了能在 Windows 中正確顯示 XML 中包含的中文字符,可以使用 Kernel32.dll 中包含的 MultiByteToWideChar( ) 函數,將 UTF-8 編碼的中文字符轉換為 UTF-16 編碼方式的中文字符。在 Windows 中能正確顯示 UTF-16 編碼的中文字符,不會出現亂碼。
3. 使用 tinyxml2::XMLDocument 類的 Print( ) 方法輸出 XML 文件中的內容時,Print( ) 方法不會對 XML 規范中定義的轉義字符做轉換。在本例中,Print( ) 方法被調用后,并未將 & 轉換為 & 。
4. 當 tinyxml2::XMLNode::ToText( ) 方法被調用時,會自動處理 XML 規范中定義的轉義字符。在本例中,將 & 自動轉換為 & ,不需要編程者再做處理。
在文本編輯器 EditPlus 或 Notepad++ 中,能夠選擇文件編碼方式,操作類似于下圖:
對于 Example.xml 這個文件,不管以包含 BOM 的 UTF-8 編碼方式保存它,還是以不帶 BOM 的 UTF-8 編碼方式保存它,運行上面的示例程序,發現都能夠正常執行。由此可知,對于 UTF-8 編碼的 XML 文件中包含或不包含 BOM 這兩種情況,TinyXML-2 都能夠正確處理。
總結
以上是生活随笔為你收集整理的tinyxml 读取文本节点_在Windows下使用TinyXML-2读取UTF-8编码包含中文字符的XML文件...的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: oracle数据库连接检查,检查Orac
- 下一篇: android属性动画缩放和平移同时,A