C++ DOM读写xml(msxml6)

19 篇文章 1 订阅
2 篇文章 0 订阅

最近使用C++ DOM增删XML上的一个节点,以前没有写过,写的过程中也碰到一些问题,写完后整理了一下。运行在windows上,我用vs2015编译的。

参考了https://www.cnblogs.com/areliang/archive/2011/11/23/2260566.html

示例中,添加函数会创建如下的xml。

<?xml version="1.0" encoding="utf-8"?>
<Animals>
  <dog>hei bei</dog>
  <pig>pei qi</pig>
  <Cat>hua mao</Cat>
  <Cat name="jiafei" color="yellow">jia fei mao</Cat>
  <Cat name="jingzhang" color="black">hei mao jing zhang</Cat>
</Animals>
#include <iostream>
#include <atlbase.h>
#include <msxml6.h>
#include <Windows.h>

#pragma comment(lib, "msxml6.lib")

using namespace std;

void CreateXmlAndAddNode()
{
	CoInitialize(NULL);
	CComPtr<IXMLDOMDocument> spXmldoc;
	HRESULT hr = spXmldoc.CoCreateInstance(CLSID_DOMDocument60);
	if (SUCCEEDED(hr))
	{
		CComPtr<IXMLDOMProcessingInstruction> spDOMPI;
		hr = spXmldoc->createProcessingInstruction(L"xml", L"version='1.0' encoding='utf-8'", &spDOMPI); // 创建声明

		if (hr == S_OK)
		{
			CComPtr<IXMLDOMNode> outNode;
			spXmldoc->appendChild(spDOMPI, &outNode);	//添加首行节点
			outNode.Detach();

			CComPtr<IXMLDOMElement> pDOMRoot;
			hr = spXmldoc->createElement(L"Animals", &pDOMRoot);
			spXmldoc->appendChild(pDOMRoot, &outNode);		//添加根节点
			outNode.Detach();

			if (hr == S_OK)
			{
				CComPtr<IXMLDOMText> textNode;
				spXmldoc->createTextNode(L"\n\t", &textNode);
				
				CComPtr<IXMLDOMElement> pDOMElement1;
				pDOMRoot->appendChild(textNode, NULL);
				textNode.Detach();
				spXmldoc->createElement(L"dog", &pDOMElement1);
				pDOMElement1->put_text(L"hei bei");
				pDOMRoot->appendChild(pDOMElement1, NULL);

				spXmldoc->createTextNode(L"\n\t", &textNode);
				pDOMRoot->appendChild(textNode, NULL);
				textNode.Detach();
				CComPtr<IXMLDOMElement> pDOMElement2;
				spXmldoc->createElement(L"pig", &pDOMElement2);
				pDOMElement2->put_text(L"pei qi");
				pDOMRoot->appendChild(pDOMElement2, NULL);
		

				spXmldoc->createTextNode(L"\n\t", &textNode);
				pDOMRoot->appendChild(textNode, NULL);
				textNode.Detach();
				CComPtr<IXMLDOMElement> pDOMElement3;
				spXmldoc->createElement(L"Cat", &pDOMElement3);
				pDOMElement3->put_text(L"hua mao");
				pDOMRoot->appendChild(pDOMElement3, NULL);
			
				spXmldoc->createTextNode(L"\n\t", &textNode);
				pDOMRoot->appendChild(textNode, NULL);
				textNode.Detach();
				CComPtr<IXMLDOMElement> pDOMElement4;
				spXmldoc->createElement(L"Cat", &pDOMElement4);
				pDOMElement4->put_text(L"jia fei mao");
				pDOMElement4->setAttribute(L"name", CComVariant("jiafei"));	//添加属性
				pDOMElement4->setAttribute(L"color", CComVariant("yellow"));
				pDOMRoot->appendChild(pDOMElement4, NULL);
				
				spXmldoc->createTextNode(L"\n\t", &textNode);
				pDOMRoot->appendChild(textNode, NULL);
				textNode.Detach();
				CComPtr<IXMLDOMElement> pDOMElement5;
				spXmldoc->createElement(L"Cat", &pDOMElement5);
				pDOMElement5->put_text(L"hei mao jing zhang");
				pDOMElement5->setAttribute(L"name", CComVariant("jingzhang"));
				pDOMElement5->setAttribute(L"color", CComVariant("black"));
				pDOMRoot->appendChild(pDOMElement5, NULL);

				spXmldoc->createTextNode(L"\n", &textNode);
				pDOMRoot->appendChild(textNode, NULL);
				textNode.Detach();
			}
		}
		spXmldoc->save(CComVariant("cppDOM.xml"));
		spXmldoc.Detach();
	}
	CoUninitialize();
}

我的电脑里没有msxml4,我在system32下找到了msxml6.dll。试了一下也好用。需要引入这个库并包括头文件msxml6.h。这里要注意的是增加了一些空的textnode节点来换行,不加的话生成的xml内容只有一行。

删除函数://删除<Cat name="jiafei" color="yellow">jia fei mao</Cat>

这里第一次接触xpath,用它来定位节点很方便。

void DeleteNode()
{
	CoInitialize(NULL);
	CComPtr<IXMLDOMDocument> spXmldoc;
	HRESULT hr = spXmldoc.CoCreateInstance(CLSID_DOMDocument60);
	if (SUCCEEDED(hr))
	{
		VARIANT_BOOL isSuccessful;
		spXmldoc->load(CComVariant("cppDOM.xml"), &isSuccessful);
		if (VARIANT_TRUE == isSuccessful)
		{
			CComPtr<IXMLDOMElement> spRoot = NULL;
			hr = spXmldoc->get_documentElement(&spRoot);
			if (hr == S_OK)
			{
				CComPtr<IXMLDOMNode> spNode;
				//通过xpath寻找节点
				hr = spRoot->selectSingleNode(L"/Animals/Cat[contains(@name, 'jiafei') and contains(@color, 'yellow')]", &spNode);
				
				if (hr == S_OK)
				{
					spRoot->removeChild(spNode, NULL);//删除节点
				}
			}
		}
	}
	spXmldoc->save(CComVariant("cppDOM.xml"));
	spXmldoc.Detach();
	CoUninitialize();
}

删除后的xml是。

<?xml version="1.0" encoding="utf-8"?>
<Animals>
	<dog>hei bei</dog>
	<pig>pei qi</pig>
	<Cat>hua mao</Cat>
	<Cat name="jingzhang" color="black">hei mao jing zhang</Cat>
</Animals>

 

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值