windows读写XML

本文详细介绍了如何在Windows环境下使用msxml6.dll组件进行XML文件的读取和写入,包括DOMDocument对象的创建、XML文件的加载、节点操作及文件保存等步骤,并提供了一个完整的示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

windows读写xml,可以使用自带的com组件msxml6.dll。

一,引用组件

#inport <msxml6.dll>   

注意:

1,安装的不同版本VS,xml的版本不一样,2019是msxml6.dll, 其他版本可以到system32目录下看是哪个版本。另外,64位的库在sysWow64目录下。

2,组件引用后会自动生成 msxml6.tlh,这里会有所有的组件方法。如果编译不过,可以到这个文件里找对应的,比如实例名称msxml6中是MSXML2::DOMDocument60,msxml4中是MSXML2::DOMDocument40,在tlh文件一般情况下都能快速找到对应的项。

二、读xml文件


void CxmlTestDlg::OnBnClickedButtonRead()
{
	MSXML2::IXMLDOMDocumentPtr pDoc;
	HRESULT hr = pDoc.CreateInstance(__uuidof(MSXML2::DOMDocument60));

	if (!SUCCEEDED(hr))
	{
		MessageBox(_T("创建DOMDocument对象失败。\n请检查运行环境"), _T("错误"), MB_ICONERROR);
		return;
	}
	// 读取xml
	pDoc->put_async(VARIANT_FALSE);
	VARIANT_BOOL bhr = pDoc->load((_variant_t)m_strPath);

	if (bhr != VARIANT_TRUE) {
		MessageBox(_T("无法正确读取xml文件"), _T("错误"), MB_ICONERROR);
		return;
	}

	// 根节点取得
	MSXML2::IXMLDOMElementPtr root = pDoc->documentElement;

	// 取得根节点的名字
	_variant_t strRootName = root->nodeName;
	_bstr_t wstrRootName(strRootName.bstrVal);
	MSXML2::IXMLDOMNodeListPtr nodeList = root->GetchildNodes();

	// 获取同级节点数量
	long lNodeNum = 0;
	nodeList->get_length(&lNodeNum);

	for (int i = 0; i < lNodeNum; i++)
	{
		MSXML2::IXMLDOMNodePtr pNode = NULL;
		nodeList->get_item(i, &pNode);
		if (pNode)
		{
			// 获取节点的所有内容
			_bstr_t bstrDocCotents = pNode->Getxml();
			CString cstrContents = (LPCTSTR)bstrDocCotents;

			// 获取节点中所有CData数据
			CString cstrText = pNode->Gettext();
			m_strSrc = cstrText;
			m_strDest = cstrContents;

			// 获取子节点
			MSXML2::IXMLDOMNodeListPtr pTmpNode = pNode->GetnextSibling();

			// 获取节点的名称
			CString cstrNodeName = pNode->nodeName;

			// 获取节点的值(此处拿到的值是CData值)
			CString cstrNodeText = pNode->text;

			// 获取节点的所有属性
			MSXML2::IXMLDOMNamedNodeMapPtr attributesPtr;
			pNode->get_attributes(&attributesPtr);

			// 获取属性的个数
			long lAttributesNum = 0;
			attributesPtr->get_length(&lAttributesNum);

			for (int j = 0; j < lAttributesNum; j++)
			{
				// 获取单个属性
				MSXML2::IXMLDOMNodePtr attributeInfo = attributesPtr->Getitem(j);

				// 获取属性名称
				CString cstrName = attributeInfo->nodeName;

				// 获取属性值
				CString cstrText = attributeInfo->text;
			}
			break;
		}
	}

	UpdateData(FALSE);
}

注意:因为是引用com组件,需要初始化环境,记得在合适的地方加入::CoInitialize(NULL); ::CoUnInitialize(NULL);

三、写xml

// 将原来的xml,重新写入新的文件,新的文件在原有文件名前加上upload
void CxmlTestDlg::OnBnClickedButtonSave()
{
	MSXML2::IXMLDOMDocumentPtr writeXmlDoc; // 用来写xml的doc

	HRESULT HR = writeXmlDoc.CreateInstance(_uuidof(MSXML2::DOMDocument60));
	if (!SUCCEEDED(HR))
	{
		return;
	}

	MSXML2::IXMLDOMDocumentPtr pDoc; // 用来读取xml的doc
	HRESULT hr = pDoc.CreateInstance(__uuidof(MSXML2::DOMDocument60));
	if (!SUCCEEDED(hr))
	{
		MessageBox(_T("创建DOMDocument对象失败。\n请检查运行环境"), _T("错误"), MB_ICONERROR);
		return;
	}

	// 读取xml
	VARIANT_BOOL bhr = pDoc->load((_variant_t)m_strFileWithPath);

	if (bhr != VARIANT_TRUE) {
		MessageBox(_T("无法正确读取xml文件"), _T("错误"), MB_ICONERROR);
		return;
	}
	// 根节点取得
	MSXML2::IXMLDOMElementPtr root = pDoc->documentElement;

	// 创建节点
	MSXML2::IXMLDOMProcessingInstructionPtr pDomPI;
	pDomPI = writeXmlDoc->createProcessingInstruction(_bstr_t("xml"), _bstr_t(_T("version=\"1.0\" encoding=\"utf-8\" ")));
	writeXmlDoc->appendChild(pDomPI);

	_variant_t strRootName = root->nodeName;
	MSXML2::IXMLDOMElementPtr rootElem = writeXmlDoc->createElement(root->nodeName);

	WriteNodeInfo(rootElem, root, writeXmlDoc);
	
	writeXmlDoc->appendChild(rootElem);
	MSXML2::IXMLDOMTextPtr rootText = pDoc->createTextNode(L"\n");
	rootElem->appendChild(rootText);
	// 获取子节点
	MSXML2::IXMLDOMNodeListPtr nodeList = root->GetchildNodes();
	
	// 获取同级节点数量
	long lNodeNum = 0;
	nodeList->get_length(&lNodeNum);
	for (int i = 0; i < lNodeNum; i++)
	{
		MSXML2::IXMLDOMNodePtr pNode = NULL;
		nodeList->get_item(i, &pNode);
		if (pNode)
		{	
			// 创建节点
			_variant_t strNode1Name = pNode->nodeName;
			MSXML2::IXMLDOMElementPtr node1Elem = writeXmlDoc->createElement(pNode->nodeName);

			WriteNodeInfo(node1Elem, pNode, writeXmlDoc);

			MSXML2::IXMLDOMNodeListPtr node2List = pNode->GetchildNodes();
			long lNodeNum2 = 0;
			node2List->get_length(&lNodeNum2);
			for (int j = 0; j < lNodeNum2; j++)
			{
				MSXML2::IXMLDOMNodePtr pNode2 = NULL;
				node2List->get_item(j, &pNode2);
				if (pNode2)
				{
					_variant_t strNode2Name = pNode2->nodeName;
					MSXML2::IXMLDOMElementPtr node2Elem = writeXmlDoc->createElement(pNode2->nodeName);

					WriteNodeInfo(node2Elem, pNode2, writeXmlDoc);
					
					MSXML2::IXMLDOMNodeListPtr node3List = pNode2->GetchildNodes();
					long lNodeNum3 = 0;
					node3List->get_length(&lNodeNum3);
					for (int k = 0; k < lNodeNum3; k++)
					{
						MSXML2::IXMLDOMNodePtr pNode3 = NULL;
						node3List->get_item(k, &pNode3);
						if (pNode3)
						{
							_variant_t strNode3Name = pNode3->nodeName;
							MSXML2::IXMLDOMElementPtr node3Elem = writeXmlDoc->createElement(pNode3->nodeName);

							WriteNodeInfo(node3Elem, pNode3, writeXmlDoc);
							MSXML2::IXMLDOMNodeListPtr node4List = pNode3->GetchildNodes();

							int nRowRecord = 0;
							long lNodeNum4 = 0;
							node4List->get_length(&lNodeNum4);
							for (int m = 0; m < lNodeNum4; m++)
							{
								MSXML2::IXMLDOMNodePtr pNode4 = NULL;
								node4List->get_item(m, &pNode4);
								if (pNode4)
								{
									CString strNode3Name = pNode4->nodeName;
									MSXML2::IXMLDOMElementPtr node4Elem = writeXmlDoc->createElement(pNode4->nodeName);
									if (strNode3Name.CompareNoCase(L"Row") == 0 )
									{
										if (nRowRecord++ == 0)
										{
											AddCheckNode(writeXmlDoc, node3Elem);
										}
										// 写入test
										CString cstrText = pNode4->Gettext();
										CString cstrNodeText;
										cstrNodeText.Format(_T("11122223334455555")/*, cstrText*/);
										MSXML2::IXMLDOMCDATASectionPtr DOMNodePtr = writeXmlDoc->createCDATASection(cstrNodeText.GetBuffer());
										node4Elem->appendChild(DOMNodePtr);
										MSXML2::IXMLDOMTextPtr node4Text = pDoc->createTextNode(L"\n\t\t\t\t");
										node3Elem->appendChild(node4Text);
										node3Elem->appendChild(node4Elem);

										continue;
									}
									
									WriteNodeInfo(node4Elem, pNode4, writeXmlDoc);
									MSXML2::IXMLDOMTextPtr node4Text = pDoc->createTextNode(L"\n\t\t\t\t");
									node3Elem->appendChild(node4Text);
									node3Elem->appendChild(node4Elem);
								}

							}

							MSXML2::IXMLDOMTextPtr node3Text = pDoc->createTextNode(L"\n\t\t\t");
							node2Elem->appendChild(node3Text);
							node2Elem->appendChild(node3Elem);
							MSXML2::IXMLDOMTextPtr node3TailText = pDoc->createTextNode(L"\n\t");
							node2Elem->appendChild(node3TailText);
						}
					}

					MSXML2::IXMLDOMTextPtr node2Text = pDoc->createTextNode(L"\n\t\t");
					node1Elem->appendChild(node2Text);
					node1Elem->appendChild(node2Elem);
					MSXML2::IXMLDOMTextPtr node2TailText = pDoc->createTextNode(L"\n\t");
					node1Elem->appendChild(node2TailText);
				}
			}

			MSXML2::IXMLDOMTextPtr node1Text = pDoc->createTextNode(L"\n\t");
			rootElem->appendChild(node1Text);
			rootElem->appendChild(node1Elem);
			MSXML2::IXMLDOMTextPtr node1TailText = pDoc->createTextNode(L"\n");
			rootElem->appendChild(node1TailText);
		}
	}

	m_strDest = (char *)writeXmlDoc->Gettext();
	CString file = m_strPath + L"\\upload_" + m_strFileName;
	writeXmlDoc->save(file.GetBuffer());
	rootElem.Release();
	writeXmlDoc.Release();
	UpdateData(FALSE);
}

需要demo的同学,可以留言或联系邮箱:yujingjiang86@163.com

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

大余里

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值