--------------------
在项目 -> 属性 -> C/C++->预处理器 -> 预处理器定中添加 _CRT_SECURE_NO_WARNINGS
-------------------------------
pch.h
#import < msxml6.dll >
---------------------
xml2txtDlg.h
#include <fstream>
using namespace std;
public:
void ReadCases(MSXML2::IXMLDOMNodeListPtr nodeList);
char* CString2Char(CString& str);
ofstream txtFile;
-------------------
xml2txtDlg.cpp
void Cxml2txtDlg::OnBnClickedButton1()
{
// TODO: 在此添加控件通知处理程序代码
::CoInitialize(NULL);//必须加初始化,否则异常
MSXML2::IXMLDOMDocumentPtr pDoc;
HRESULT hr = pDoc.CreateInstance(__uuidof(MSXML2::DOMDocument60));
if (!SUCCEEDED(hr))
{
MessageBox(_T(" 无法创建DOMDocument 对象,请检查是否安装了MS XML Parser 运行库! "));
return;
}
// 加载文件
pDoc->put_async(VARIANT_FALSE);
char* strXmlPath = "D:\\考研\\复试\\专业面试\\读写XML\\test1.XML";
VARIANT_BOOL bhr = pDoc->load((_variant_t)strXmlPath);
// load 函数只能用variant_t 类型于是这里用char 去写路径,不然还是CString好用
if (!bhr)
{
MessageBox(_T(" 无法打开XML 文件"));//测试过,基本上都能打开
return;
}
// 根节点取得
MSXML2::IXMLDOMElementPtr root = pDoc->documentElement;
// 取得根节点的名字
_variant_t strRootName = root->nodeName;
//nodelist得到所有结点的链表
MSXML2::IXMLDOMNodeListPtr nodeList = root->GetchildNodes();
int ilength = nodeList->Getlength();//这里的长度函数很好用
// 打开文件
txtFile.open("D:\\考研\\复试\\专业面试\\读写XML\\test1.txt", 'w');
for (int nodeCount = 0; nodeCount < ilength; nodeCount++)
{
MSXML2::IXMLDOMNodePtr nodePtr = nodeList->nextNode();
_variant_t strNodeName = nodePtr->GetnodeName();
_variant_t strNodeValue = nodePtr->GetfirstChild()->GetnodeValue();
//MessageBox(strNodeName.bstrVal);
ReadCases(nodePtr->GetchildNodes());//用函数去遍历每个子结点的所有子节点。
}
txtFile.close();
UpdateData(FALSE);
}
void Cxml2txtDlg::ReadCases(MSXML2::IXMLDOMNodeListPtr nodeList)
//传入list
{
CString strLine;
int ilength = nodeList->Getlength();
for (int nodeCount = 0; nodeCount < ilength; nodeCount++)
{
if (nodeCount != 0)
{
strLine += ",";
}
// 获取这个节点的数据
MSXML2::IXMLDOMNodePtr nodePtr = nodeList->nextNode();
_variant_t strNodeName = nodePtr->GetnodeName();
_variant_t strNodeValue = nodePtr->GetfirstChild()->GetnodeValue();
//MessageBox(strNodeValue.bstrVal);
CString strname = COLE2T(strNodeName.bstrVal);
CString strvalue = COLE2T(strNodeValue.bstrVal);
strLine += strvalue;
}
// 存文件
CString strTxt;
strTxt = strLine + _T("\r\n");
char* str = CString2Char(strTxt);
txtFile << str;
}
char* Cxml2txtDlg::CString2Char(CString& str)
{
int n = str.GetLength(); //
//获取宽字节字符的大小,大小是按字节计算的
int len = WideCharToMultiByte(CP_ACP, 0, str, str.GetLength(), NULL, 0, NULL, NULL);
//为多字节字符数组申请空间,数组大小为按字节计算的宽字节字节大小
char* pFileName = new char[len + 1]; //以字节为单位
//宽字节编码转换成多字节编码
WideCharToMultiByte(CP_ACP, 0, str, str.GetLength(), pFileName, len, NULL, NULL);
pFileName[len] = '\0'; //多字节字符以'\0'结束
return pFileName;
}