使用MSXML2解析XML文件
最近在做项目的过程中,需要解析XML文件的内容。本篇文章记录一下自己使用MSXML2解析XML文件。
XML文件说明
- 1.什么是XML?XML文件的存储格式是怎样的?
- 2.什么是MSXML2?
- 3.如何使用MSXML2解析XML文件?
1.什么是XML?XML文件的存储格式是怎样的?
1.XML文件的定义:
可扩展标记语言,标准通用标记语言的子集,简称XML,是一种用于标记电子文件使其具有结构性的标记语言。——摘自百度百科。大家可以参考什么是XML文件
2.XML文件的格式或者内容长什么样子呢
<?xml version="1.0" encoding="UTF-8"?>
<site><name>RUNOOB</name><url>https://www.runoob.com</url><logo>runoob-logo.png</logo><desc>编程学习网站</desc>
</site>
如上所述,第一行以XML开头,用来描述文档的一些信息。
,,, 都是标签,分别包含了要传递的信息。
标签必须成对出现,又开始标签就有结束标签。
XML文件形成了一种树结构,它从“根部“”开始,然后扩展到“枝叶”。
根元素:
开始标签:
结束标签:
接下来是描述根的子元素:
还有包含在子元素的中的文本分别是:
RUNOOB
https://www.runoob.com
runoob-logo.png
编程学习网站
下面看一张图更加的直观,有助于理解
<bookstore><book category="COOKING"><title lang="en">Everyday Italian</title><author>Giada De Laurentiis</author><year>2005</year><price>30.00</price></book><book category="CHILDREN"><title lang="en">Harry Potter</title><author>J K. Rowling</author><year>2005</year><price>29.99</price></book><book category="WEB"><title lang="en">Learning XML</title><author>Erik T. Ray</author><year>2003</year><price>39.95</price></book>
</bookstore>
实例中的根元素是 。文档中的所有 元素都被包含在 中。
元素有 4 个子元素:、、、。
关于XML文档更加详细的说明大家可以参考[菜鸟教程]中的说明。(https://www.runoob.com/xml/xml-tree.html)
2.什么是MSXML2?
百度百科上的说法是:msxml指微软的xml语言解析器,用来解释xml语言的。
MSXML的主要接口有哪些呢:
1.DOM Document
DOMDocument对象是XML DOM的基础,你可以利用它所暴露的属性和方法来允许你浏览、查询和修改XML文档的内容和结构。DOMDocument表示了树的顶层节点。它实现了DOM文档的所有的基本的方法并且提供了额外的成员函数来支持XSL和XSLT。它创建了一个文档对象,所有其他的对象都可以从这个文档对象中得到和创建。
2.IXML DOMNode
IXMLDOMNode是文档对象模型(DOM)中的基本的对象,元素,属性,注释,过程指令和其他的文档组件都可以认为是IXMLDOMNode,事实上,DOMDocument对象本身也是一个IXMLDOMNode对象。
3.IXML DOM NodeList
IXMLDOMNodeList实际上是一个节点(Node)对象的集合,节点的增加、删除和变化都可以在集合中立刻反映出来,可以通过“for…next”结构来遍历所有的节点。
4、IXMLDOMParseError
IXMLDOMParseError接口用来返回在解析过程中所出现的详细的信息,包括错误号,行号,字符位置和文本描述。
3.如何使用MSXML2解析XML文件?
MSXML2的使用方法大家可以参考MSXML2使用教程
下面我讲一下我使用MSXML2解析XML文件:
我用的是VS2022.
第一步:
在framework.h中添加如下语句:
#import"C:\\Windows\\System32\\msxml6.dll"
using namespace MSXML2;// 最好把这一段也加上
#ifdef _UNICODE
#if defined _M_IX86
#pragma comment(linker,"/manifestdependency:\"type='win32' name='Microsoft.Windows.Common-Controls' version='6.0.0.0' processorArchitecture='x86' publicKeyToken='6595b64144ccf1df' language='*'\"")
#elif defined _M_X64
#pragma comment(linker,"/manifestdependency:\"type='win32' name='Microsoft.Windows.Common-Controls' version='6.0.0.0' processorArchitecture='amd64' publicKeyToken='6595b64144ccf1df' language='*'\"")
#else
#pragma comment(linker,"/manifestdependency:\"type='win32' name='Microsoft.Windows.Common-Controls' version='6.0.0.0' processorArchitecture='*' publicKeyToken='6595b64144ccf1df' language='*'\"")
#endif
#endif
大家如果找不到msxml6.dll的话,可以使用everything搜索即可。
由于我的项目是对话框项目,界面如下:
第二步:编写创建和读写XML文件的代码
1.我的项目名称叫做ReadWriteXML,创建XML文件的按钮代码如下:
void CReadWriteXMLDlg::OnBnClickedBtnCreate()
{// TODO: 在此添加控件通知处理程序代码// 创建一个文档指针MSXML2::IXMLDOMDocumentPtr pDoc;MSXML2::IXMLDOMElementPtr pRoot;// 实例化文档指针HRESULT hr = pDoc.CreateInstance(__uuidof(MSXML2::DOMDocument60));if (!SUCCEEDED(hr)){MessageBox(_T("XML文件创建失败!"));return;}pDoc->raw_createElement((_bstr_t)_T("China"),&pRoot);pDoc->raw_appendChild(pRoot,NULL);MSXML2::IXMLDOMElementPtr pElemNode;pDoc->raw_createElement((_bstr_t)_T("City"), &pElemNode);pElemNode->Puttext(_T("上海"));pElemNode->setAttribute(_T("Population"),_T("5000"));pElemNode->setAttribute(_T("Area"), _T("3000"));pRoot->appendChild(pElemNode);pDoc->raw_createElement((_bstr_t)_T("City"), &pElemNode);pElemNode->Puttext(_T("深圳"));pElemNode->setAttribute(_T("Population"), _T("2000"));pElemNode->setAttribute(_T("Area"), _T("1000"));pRoot->appendChild(pElemNode);pDoc->raw_createElement((_bstr_t)_T("City"), &pElemNode);pElemNode->Puttext(_T("北京"));pElemNode->setAttribute(_T("Population"), _T("8000"));pElemNode->setAttribute(_T("Area"), _T("6000"));pRoot->appendChild(pElemNode);pDoc->raw_createElement((_bstr_t)_T("City"), &pElemNode);pElemNode->Puttext(_T("广州"));pElemNode->setAttribute(_T("Population"), _T("9000"));pElemNode->setAttribute(_T("Area"), _T("7000"));pRoot->appendChild(pElemNode);pDoc->save(_T("..\\Bin\\MyTest.xml"));
}
创建的XML文件内容如下:
<China>
<City Population="5000" Area="3000">上海</City>
<City Population="2000" Area="1000">深圳</City>
<City Population="8000" Area="6000">北京</City>
<City Population="9000" Area="7000">广州</City>
</China>
2.读取XML文件的代码如下:
void CReadWriteXMLDlg::OnBnClickedBtnRead()
{// TODO: 在此添加控件通知处理程序代码// 先删除所有,再读取m_ListXMLInfo.DeleteAllItems();// 创建一个XML文档指针MSXML2::IXMLDOMDocumentPtr pDoc;// 实例化一个文档指针HRESULT hr = pDoc.CreateInstance(__uuidof(MSXML2::DOMDocument60));if (!SUCCEEDED(hr)){MessageBox(_T("加载XML文件错误!"));return;}// 加载XML文件VARIANT_BOOL Load = pDoc->load((_bstr_t)_T("..\\Bin\\MyTest.xml"));if (Load != -1){MessageBox(_T("加载XML文件错误!"));return;}// 声明一个元素指针MSXML2::IXMLDOMElementPtr pElemNode;// 获取元素的信息;selectSingleNode():如果查询到一个或者多个结点,则返回第一个结点。否则返回NULLpElemNode = (MSXML2::IXMLDOMElementPtr)(pDoc->selectSingleNode(_T("//China")));// 声明一个容器类型,该类型通常用于容纳属性MSXML2::IXMLDOMNamedNodeMapPtr pAttrs = NULL;// 声明一个结点链表指针,可以增加,或者删除结点MSXML2::IXMLDOMNodeListPtr pNodeList = NULL;// 声明结点指针MSXML2::IXMLDOMNodePtr pAttrItem = NULL;// 获取pNodeList指向的子节点pElemNode->get_childNodes(&pNodeList);long nCount, iCount;MSXML2::IXMLDOMElementPtr pCurNode;// 获取pNodeList中结点的个数pNodeList->get_length(&iCount);for (int i = 0; i < iCount; i++){// nextNode:获取当前节点和CObList链表很像pCurNode = pNodeList->nextNode();// getAttribute:获取当前结点的属性集CString strPopular = pCurNode->getAttribute(_T("Population"));CString strArea = pCurNode->getAttribute(_T("Area"));// Gettext:获取属性对应的文本;Puttext():设置文本CString strElemText = (_bstr_t)pCurNode->Gettext();// 将获取的属性值添加到CListCtrl控件中m_ListXMLInfo.InsertItem(i, strElemText);m_ListXMLInfo.SetItemText(i,1, strPopular);m_ListXMLInfo.SetItemText(i, 2, strArea);}
}
从XML文件中读取的内容如下:
3.添加结点的代码如下:
void CReadWriteXMLDlg::OnBnClickedBtnAddinfo()
{// TODO: 在此添加控件通知处理程序代码UpdateData(TRUE);MSXML2::IXMLDOMDocumentPtr pDoc;HRESULT hr = pDoc.CreateInstance(__uuidof(MSXML2::DOMDocument60));if (!SUCCEEDED(hr)){MessageBox(_T("加载XML文件错误!"));return;}VARIANT_BOOL Load = pDoc->load((_bstr_t)_T("..\\Bin\\MyTest.xml"));if (Load != -1){MessageBox(_T("加载XML文件错误!"));return;}MSXML2::IXMLDOMElementPtr pElemNode;pDoc->raw_createElement((_bstr_t)_T("City"), &pElemNode);pElemNode->Puttext((_bstr_t)m_strCity);CString strPeople, strArae;strPeople.Format(_T("%d"), m_nPeople);strArae.Format(_T("%d"), m_nArea);pElemNode->setAttribute(_T("Population"), (_bstr_t)strPeople);pElemNode->setAttribute(_T("Area"), (_bstr_t)strArae);MSXML2::IXMLDOMElementPtr pRoot;pRoot = (MSXML2::IXMLDOMElementPtr)(pDoc->selectSingleNode(_T("//China")));pRoot->appendChild(pElemNode);pDoc->save(_T("..\\Bin\\MyTest.xml"));m_ListXMLInfo.DeleteAllItems();OnBnClickedBtnRead();
}
添加结点的效果如下:
4.删除结点的代码如下:
void CReadWriteXMLDlg::OnBnClickedBtnDelete()
{// TODO: 在此添加控件通知处理程序代码MSXML2::IXMLDOMDocumentPtr pDoc;HRESULT hr = pDoc.CreateInstance(__uuidof(MSXML2::DOMDocument60));if (!SUCCEEDED(hr)){MessageBox(_T("加载XML文件错误!"));return;}VARIANT_BOOL Load = pDoc->load((_bstr_t)_T("..\\Bin\\MyTest.xml"));if (Load != -1){MessageBox(_T("加载XML文件错误!"));return;}MSXML2::IXMLDOMElementPtr pRoot;pRoot = (MSXML2::IXMLDOMElementPtr)(pDoc->selectSingleNode(_T("//China")));MSXML2::IXMLDOMNodeListPtr pNodeList;pNodeList = pRoot->selectNodes(_T("City"));MSXML2::IXMLDOMNodePtr pNode;pNode = pNodeList->Getitem(m_nIndex);MSXML2::IXMLDOMNodePtr pOldNode;pRoot->raw_removeChild(pNode,&pOldNode);pDoc->save(_T("..\\Bin\\MyTest.xml"));m_ListXMLInfo.DeleteAllItems();OnBnClickedBtnRead();
}
删除结点的效果如下:
小结:使用MSXML2解析XML文件,最主要是要弄清楚MSXML2::IXMLDOMDocumentPtr、MSXML2::IXMLDOMElementPtr、MSXML2::IXMLDOMNodeListPtr、
MSXML2::IXMLDOMNodePtr
这几个类之间的关系。这需要大家不断的调试,尝试。欢迎大家交流指正,谢谢大家。
关于项目的源码大家可以参考码云
文章参考:
全面解析XML
菜鸟教程
使用MSXML2解析XML文件相关推荐
- python中利用lxml模块解析xml文件报错XMLSyntaxError: Opening and ending tag mismatch
今天在代码中第一次使用lxml解析xml文件时出错了, XMLSyntaxError: Opening and ending tag mismatch: keyEffectiveDate line 2 ...
- java xml中的冒号_Java jdom解析xml文件带冒号的属性
Java jdom解析xml文件带冒号的属性 如果xml文件解析带了冒号的属性,一般都是要特别处理,这里是命名空间,N年前遇到过一次忘记记录,后来也忘了,这次再记录下. 解决了,记录下,分享给大家,百 ...
- XML专题:使用NSXMLParser解析xml文件
使用NSXMLParser解析xml文件 1. 设置委托对象,开始解析 NSXMLParser *parser = [[NSXMLParser alloc] initWithData:dat ...
- SAX解析XML文件
就目前来说,有三种方式可以解析XML文件:DOM.SAX.StAX.DOM将整个XML文件加载到内存中,并构建出节点树:应用程序可以通过遍历节点树的方式来解析XML文件中的各个节点.属性等信息:这种方 ...
- Java--Dom解析XML文件
之前写过几篇关于Java中解析XML文件的方法,不过,感觉不够简单,今天重写了一遍代码,用到的是方法是Dom,其中加入了日志记录功能--Log4j. 好了,不多说了,先把XMl ...
- 10. 解析XML文件(SAX/DOM/ElementTre)
XML的全称是eXtensible Markup Language, 意为可扩展的标记语言, 是一种用于标记电子文件使其具有结构性的标记语言.以XML结构存储数据的文件就是XML文件,它被设计用来传输 ...
- Dom方法,解析XML文件
Dom方法,解析XML文件的基本操作 1 package com.demo.xml.jaxp; 2 3 import java.io.IOException; 4 5 import javax.xml ...
- [转载]VC轻松解析XML文件 - CMarkup类的使用方法
VC轻松解析XML文件 - CMarkup类的使用方法 VC解析XML文件的工具有很多,CMarkup, tinyXML,还有IBM的,MS的等等. 据说tinyXML很好,可能字符集问题,我编译不了 ...
- python读取xml标注坐标_遍历文件 创建XML对象 方法 python解析XML文件 提取坐标计存入文件...
XML文件??? xml即可扩展标记语言,它可以用来标记数据.定义数据类型,是一种允许用户对自己的标记语言进行定义的源语言. 里面的标签都是可以随心所欲的按照他的命名规则来定义的,文件名为roi.xm ...
最新文章
- Facebook 发布深度学习工具包 PyTorch Hub,让论文复现变得更容易
- OpenCV(基础补充)颜色空间HSV *args与**args(滑动条传参问题)
- 眼球网站经济学之我见——在网站上建立现代的经济体系
- 2012年08月13日
- 基于量子粒子群算法实现天线阵列优化
- html获取鼠标按键数,鼠标在IE、Firefox和Opera点击键所对应的数字代码
- JDK 14的新特性:instanceof模式匹配
- 安装 深度wine_深度系统更新(2020.11.25)
- 和could的区别用法_高考英语语法情态动词用法指南
- (转)驱动开发之五 --- TDI之八 【译文】
- 软考资料(系统集成管理工程师)无偿分享
- ASC码表 和 转义字符表
- Python练手项目:计算机自动还原魔方(5)最后一步
- Android Reboot 命令执行过程
- 英语老师自用省心天花板小程序
- 往事如烟 - 老柏1
- 直线上最多的点数java
- SAP 打开或关闭财务账期和物料账期等事物代码清单-OB52/MMPV/MMRV/OKP1/1KEF
- cmd ping 一台计算机名,windows CMD命令查看局域网内所有主机名及IP
- C语言 - 字符常量 字符串常量
热门文章
- ERROR: Unable to launch the RTL Schematic process. The input NGR file, Can not fnd the module的解决方法
- es bulk java_Java Elasticsearch Bulk API 批量操作
- p元素里面不能嵌套div元素
- html 左边固定右边自动,css经典布局之左侧固定大小右侧自动适应
- VS Code 插件的开发及发布指南
- Eureka的限流算法类RateLimiter源码解读
- sparkstreaming处理kafka数据,数据积压问题解决方案
- 19 Flowable任务之调用子流程(CallActivity)
- Tableau用多线图展示多个指标
- 基于PHP的视频社交管理系统