xml2txt

该文章描述了一个C++项目,其中使用MSXML库读取XML文件,通过DOMDocument接口解析XML,然后将数据写入TXT文件。项目在预处理器设置中禁用了_CRT_SECURE_NO_WARNINGS警告,并实现了递归遍历XML节点的功能。
摘要由CSDN通过智能技术生成

--------------------

在项目 -> 属性 -> 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;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值