有空再来细说,先贴个代码占位置
#include <iostream> #include <string> #include <cstdlib> #include <tchar.h> #include <stdio.h> #include <Windows.h> ///////////////////////////////////////////////////// //desc: //测试文件:test.xml,文件编码格式:utf-8 //旧版本:CMarkupSTL7.1,新版本:CMarkup:11.5 //开启 预定义 OLD_MARKUP_VERSION ,xml的解析使用旧的CMarkupSTL //注释掉该行,则xml的解析使用新的CMarkup //并且可以通过更改项目属性中的字符集,来确定该如何解析 ///////////////////////////////////////////////////// #define OLD_MARKUP_VERSION 1 #ifdef OLD_MARKUP_VERSION #include "markupstl.h" #define CMarkup CMarkupSTL #else #include "Markup.h" #endif int main(void) { CMarkup m_MarkupSTL; #if (defined(MARKUP_WCHAR) && ! defined(OLD_MARKUP_VERSION) ) std::cout << "UNICODE MODEL" << std::endl; if(!m_MarkupSTL.Load(_T("test.xml"))) { std::cout<<"the path error!"; return false; } m_MarkupSTL.ResetPos(); while ( m_MarkupSTL.FindChildElem(_T("pp_data"))) { std::wstring docId=m_MarkupSTL.GetChildAttrib(_T("id")); //docId=atoi(m_MarkupSTL.GetChildAttrib("id").c_str()); std::wcout<<"movie id:"<< docId << std::endl; m_MarkupSTL.IntoElem(); ///attention here! if(m_MarkupSTL.FindChildElem(_T("url"))) //字段读取顺序和xml文件要一致 { std::wstring url=m_MarkupSTL.GetChildData(); if(url.empty() || url[0]=='\0') url = _T("12345"); std::wcout << L"url :" << url << std::endl; } m_MarkupSTL.FindChildElem(_T("img")); std::wcout << m_MarkupSTL.GetChildData() << std::endl; // char ctf[1000]; m_MarkupSTL.FindChildElem(_T("name")); std::wstring name = m_MarkupSTL.GetChildData(); WideCharToMultiByte( CP_ACP, 0, name.c_str(), -1, ctf, 1000, NULL, NULL ); std::cout << "name :" << ctf << std::endl; //std::wcout << name << std::endl; m_MarkupSTL.FindChildElem(_T("desc")); std::wstring desc = m_MarkupSTL.GetChildData(); WideCharToMultiByte( CP_ACP, 0, desc.c_str(), -1, ctf, 1000, NULL, NULL ); std::cout << "decs :" << ctf << std::endl; //std::wcout << desc << std::endl; //wprintf(L"%s\n",desc.c_str()); m_MarkupSTL.OutOfElem(); } #else //ANSI #ifdef OLD_MARKUP_VERSION std::cout << "old markup " << std::endl; #else std::cout << "ANSI MODLE" << std::endl; #endif const char* src_file = "test.xml"; #ifdef OLD_MARKUP_VERSION int MAX_LEN=102400; WCHAR wfilebuf [102400] = L""; char filebuf[102400] = ""; FILE*fp = fopen(src_file,"r"); fseek(fp,0,SEEK_END); int nbytes = ftell(fp); fseek(fp,0,SEEK_SET); fread(filebuf,nbytes,1,fp); fclose(fp); MultiByteToWideChar(CP_UTF8,0,filebuf,-1,wfilebuf,MAX_LEN); WideCharToMultiByte(CP_ACP,0,wfilebuf,-1,filebuf,MAX_LEN,NULL,NULL); m_MarkupSTL.SetDoc(filebuf); #else if(!m_MarkupSTL.Load(src_file)){ std::cout << "load error" << std::endl; return false; } #endif m_MarkupSTL.ResetPos(); while(m_MarkupSTL.FindChildElem("pp_data")){ std::string id = m_MarkupSTL.GetChildAttrib("id"); std::cout << "movie id:" << id << std::endl; m_MarkupSTL.IntoElem(); m_MarkupSTL.FindChildElem("url"); std::string url = m_MarkupSTL.GetChildData(); std::cout << "url :" << url << std::endl; m_MarkupSTL.FindChildElem("img"); std::string img = m_MarkupSTL.GetChildData(); std::cout << "img :" << img << std::endl; m_MarkupSTL.FindChildElem("name"); std::string name = m_MarkupSTL.GetChildData(); std::cout << "name :" << name << std::endl;; m_MarkupSTL.FindChildElem("desc"); std::string desc = m_MarkupSTL.GetChildData(); std::cout << "desc :" << desc << std::endl; m_MarkupSTL.OutOfElem(); } #endif std::system("PAUSE"); }