`
逆风的香1314
  • 浏览: 1416168 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

利用VC++与MSXML解析XML文档

阅读更多
一、文档对象模型(DOM)
  DOM是Document Object Model(文档对象模型)的简称,是对XML文档进行应用开发、编程的应用程序接口(API)。作为W3C公布的一种跨平台、与语言无关的接口规范,DOM提供了在不同环境和应用中的标准程序接口,可以用任何语言实现。
  DOM采用对象模型和一系列的接口来描述XML文档的内容和结构,即利用对象把文档模型化。这种对象模型实现的基本功能包括:
  ● 描述文档表示和操作的接口;
  ● 接口的属性和方法;
  ● 接口之间的关系以及互操作。
   DOM可对结构化的XML文档进行解析,文档中的指令、元素、实体、属性等所有内容个体都用对象模型表示,整个文档被看成是一个有结构的信息树,而不是 简单的文本流,生成的对象模型就是树的节点,对象同时包含了方法和属性。因此,对文档的所有操作都是在对象树上的进行。在DOM中,树中的一切都是对象, 不管是根节点还是实体的属性。
  在DOM中主要有以下三个对象:
  ● XML文档对象
XML文档既是一种对象,同时又代表整个XML文档。它由根元素和子元素组成。
  ● XML节点对象
XML节点对象代表的是XML文档内部的节点,如元素、注释、名字空间等。
  ● XML节点列表
XML文档模块列表代表了节点的集合。
  利用DOM,开发人员可以动态地创建XML文档,遍历结构,添加、修改、删除内容等。其面向对象的特性,使人们在处理XML解析相关的事务时节省大量的精力,是一种符合代码重用思想的强有力编程工具。
二、DOM的四个基本接口(引用自:http://bbs.xml.org.cn/dispbbs.asp?boardID=11&ID=9220)

 

在DOM 接口规范中,有四个基本的接口:Document,Node,NodeList以及NamedNodeMap。在这四个基本接口中,Document接口 是对文档进行操作的入口,它是从Node接口继承过来的。Node接口是其他大多数接口的父类,象Documet,Element,Attribute, Text,Comment等接口都是从Node接口继承过来的。NodeList接口是一个节点的集合,它包含了某个节点中的所有子节点。 NamedNodeMap接口也是一个节点的集合,通过该接口,可以建立节点名和节点之间的一一映射关系,从而利用节点名可以直接访问特定的节点。下面将 对这四个接口分别做一些简单的介绍。 
1、Document接口 
Document接口代表了整个XML/HTML文档,因此,它是整棵文档树的根,提供了对文档中的数据进行访问和操作的入口。
由 于元素、文本节点、注释、处理指令等都不能脱离文档的上下文关系而独立存在,所以在Document接口提供了创建其他节点对象的方法,通过该方法创建的 节点对象都有一个ownerDocument属性,用来表明当前节点是由谁所创建的以及节点同Document之间的联系。
在DOM树中, Document节点是DOM树中的根节点,也即对XML文档进行操作的入口节点。通过Docuemt节点,可以访问到文档中的其他节点,如处理指令、注 释、文档类型以及XML文档的根元素节点等等。另外,在一棵DOM树中,Document节点可以包含多个处理指令、多个注释作为其子节点,而文档类型节 点和XML文档根元素节点都是唯一的。

关于Document接口的IDL(Interface Definition Language接口定义语言)定义和其中一些比较常用的属性和方法的详细介绍可以在MSDN中找到。
2、Node接口 
Node接口在整个DOM树中具有举足轻重的地位,DOM接口中有很大一部分接口是从Node接口继承过来的,例如,Element、Attr、CDATASection等接口,都是从Node继承过来的。在DOM树中,Node接口代表了树中的一个节点。
3、NodeList接口 
NodeList接口提供了对节点集合的抽象定义,它并不包含如何实现这个节点集的定义。NodeList用于表示有顺序关系的一组节点,比如某个节点的子节点序列。另外,它还出现在一些方法的返回值中,例如GetNodeByName。
在DOM 中,NodeList的对象是"live"的,换句话说,对文档的改变,会直接反映到相关的NodeList对象中。例如,如果通过DOM获得一个 NodeList对象,该对象中包含了某个Element节点的所有子节点的集合,那么,当再通过DOM对Element节点进行操作(添加、删除、改动 节点中的子节点)时,这些改变将会自动地反映到NodeList对象中,而不需DOM应用程序再做其他额外的操作。
NodeList中的每个item都可以通过一个索引来访问,该索引值从0开始。 
4、NamedNodeMap接口 
实 现了NamedNodeMap接口的对象中包含了可以通过名字来访问的一组节点的集合。不过注意,NamedNodeMap并不是从NodeList继承 过来的,它所包含的节点集中的节点是无序的。尽管这些节点也可以通过索引来进行访问,但这只是提供了枚举NamedNodeMap中所包含节点的一种简单 方法,并不表明在DOM规范中为NamedNodeMap中的节点规定了一种排列顺序。
NamedNodeMap表示的是一组节点和其唯一名字的一一对应关系,这个接口主要用在属性节点的表示上。
与NodeList相同,在DOM中,NamedNodeMap对象也是"live"的。

三、MSXML
  
     从理论上说,根据XML的格式定义,我们可以自己编写一个XML的语法分析器,但实际上微软已经给我们提供了一个XML语法解析器,即一个叫做 MSXML.DLL的动态链接库,实际上它是一个COM(Component Object Model)对象库,里面封装了进行XML解析时所需要的所 有对象。因为COM是一种以二进制格式出现的和语言无关的可重用对象,所以你可以用任何语言(比如VB,VC,DELPHI,C++ Builder甚至 是脚本语言等等)对它进行调用,在你的应用中实现对XML文档的解析。
  MSXML.DLL所包括的主要COM接口有:
  1. IXMLDOMDocument(Document接口)
DOMDocument 对象是XML DOM的基础,你可以利用它所暴露的属性和方法来浏览、查询和修改XML文档的内容和结构。DOMDocument表示了树的顶层节点,它 实现了DOM文档的所有的基本方法,并且提供了额外的成员函数来支持XSL和XSLT。它创建了一个文档对象,所有其他的对象都可以从这个文档对象中得到 和创建。
  2. IXMLDOMNode(Node接口)
  IXMLDOMNode是文档对象模型(DOM)中的基本对象,元素、属性、注释、过程指令和其他的文档组件都可以认为是IXMLDOMNode。事实上,DOMDocument对象本身也是一个IXMLDOMNode对象。
   3. IXMLDOMNodeList
  IXMLDOMNodeList实际上是一个节点(Node)对象的集合,节点的增加、删除和变化都可以在集合中立刻反映出来,可以通过"for.循环 "结构来遍历所有的节点。
  4. IXMLDOMParseError
  IXMLDOMParseError接口用来返回在解析过程中所出现的详细的信息,包括错误号、行号、字符位置和文本描述。
   在具体应用时可以用DOMDocument的Load方法来装载XML文档,用IXMLDOMNode 的selectNodes(查询的结果有多个, 得到存放搜索结果的链表)或selectSingleNode(查询的结果有一个,在有多个的情况下返回找到的第一个节点)方法进行查询,用 createNode和appendChild方法来创建节点和追加节点,用IXMLDOMElement的setAttribute和 getAttribute方法来设置和获得节点的属性。

 



此主题相关图片如下:

 

四、编程举例

 

1、目标文档:  

 <book id="bk101">
      <author>lizlex</author>
      <title>XML Developer's Guide</title>
   </book>

2、步骤:

(1)在StdAfx.h中引入动态链接库 MSXML.DLL(C:\windows\system32\msxml4.dll)
 #import <msxml4.dll>

(2)界面设计:
分别放入三个Text,用于输入数据,与显示文档内容用,并添加关联的成员变量m_strId,m_strAuthor, m_strTitle;并添加确定按钮:

(3)产生文档的程序片断
void CXmlparseDlg::OnButtonGenerate() 
{
 UpdateData();

 MSXML2::IXMLDOMDocumentPtr pDoc; 
 MSXML2::IXMLDOMElementPtr  xmlRoot ; 

    //创建DOMDocument对象 
 HRESULT hr = pDoc.CreateInstance(__uuidof(MSXML2::DOMDocument40)); 
 if(!SUCCEEDED(hr)) 
 {  
  MessageBox("无法创建DOMDocument对象,请检查是否安装了MS XML Parser 运行库!"); 
  return ;
 } 
 
 //根节点的名称为Book
 //创建元素并添加到文档中
 xmlRoot=pDoc->createElement((_bstr_t)"Book");
 
 //设置属性
 xmlRoot->setAttribute("id",(const char *)m_strId);
 pDoc->appendChild(xmlRoot);
 MSXML2::IXMLDOMElementPtr pNode;

 //添加“author”元素
 pNode=pDoc->createElement((_bstr_t)"Author");
 pNode->Puttext((_bstr_t)(const char *)m_strAuthor);
 xmlRoot->appendChild(pNode);
 
 //添加“Title”元素
 pNode=pDoc->createElement("Title");
 pNode->Puttext((const char *)m_strTitle);
 xmlRoot->appendChild(pNode);
 
 //保存到文件 
 //如果不存在就建立,存在就覆盖 
 pDoc->save("d:\\he.xml"); 

}

(4)读取XML文档的程序片断
void CXmlparseDlg::OnButtonLoad() 
{
 MSXML2::IXMLDOMDocumentPtr pDoc;
 HRESULT hr;
 hr=pDoc.CreateInstance(__uuidof(MSXML2::DOMDocument40));
 if(FAILED(hr))
 {  
  MessageBox("无法创建DOMDocument对象,请检查是否安装了MS XML Parser 运行库!"); 
  return ;
 } 
 
 //加载文件 
 pDoc->load("d:\\he.xml"); 
 
 MSXML2::IXMLDOMNodePtr  pNode;
 
 //在树中查找名为Book的节点,"//"表示在任意一层查找 
 pNode=pDoc->selectSingleNode("//Book");

 MSXML2::DOMNodeType nodeType; 
 
 //得到节点类型 
    pNode->get_nodeType(&nodeType); 
 
 //节点名称 
 CString strName;
 
 strName=(char *)pNode->GetnodeName();
 
 //节点属性,放在链表中 
 MSXML2::IXMLDOMNamedNodeMapPtr pAttrMap=NULL;
 MSXML2::IXMLDOMNodePtr   pAttrItem;
 _variant_t variantvalue;
 pNode->get_attributes(&pAttrMap);
 
 long count;
 count=pAttrMap->get_length(&count);
 
 pAttrMap->get_item(0,&pAttrItem);
 //取得节点的值
 pAttrItem->get_nodeTypedvalue(&variantvalue);
 m_strId=(char *)(_bstr_t)variantvalue;
 
 UpdateData(FALSE);
 
}

此主题相关图片如下:

 
分享到:
评论

相关推荐

    利用VC++与MSXML解析XML文档 .rar

    本教程将详细介绍如何在VC++项目中结合MSXML库来解析XML文档,帮助开发者理解并实现XML数据的读取和处理。 首先,MSXML是Microsoft提供的XML解析器,它包含了多种接口,如DOM(Document Object Model)和SAX...

    VC++中利用MSXML解析XML文档.rar_Vc_XML解析_vc xml解析_visual studio 2008_xml

    这就是在VC++中利用MSXML解析XML文档的基本步骤。通过这种方式,你可以方便地读取、修改和创建XML文档,实现数据的存储和交换。记住,XML解析涉及到很多细节,如错误处理、内存管理以及XPath的使用,都需要根据具体...

    VC编程利用MSXML解析XML文档

    在提供的Word文档《MSXML解析XML文档.doc》中,可能会详细解释这些步骤,并给出具体的代码示例,包括如何创建解析器对象、加载XML文件、遍历和修改XML结构等。同时,文档可能还会讨论在VC++中处理XML时可能出现的...

    利用MSXML解析XML文档 (2009年)

    文中还提到了使用MSXML解析XML文档的实例。作者使用了VC++语言来实现XML文档的解析,这表明了MSXML不仅可以应用于网络脚本语言,还可以与更底层的编程语言相结合,提供强大的数据处理能力。 总结来说,这篇论文探讨...

    vc++实现读取和解析xml

    本文将详细介绍XML的基本概念、为什么使用XML以及如何在VC++中利用Microsoft XML Parser SDK来解析XML文件。 #### 二、XML基础知识 ##### 1. 什么是XML? XML是一种用来标记数据的语言,它的目标是传输和存储数据...

    解析XML文档 实现树结构实例

    在Windows环境下,使用VC++作为开发工具,我们可以利用MSXML组件来解析XML文档并构建出相应的树结构。MSXML是Microsoft提供的一个COM组件,它提供了XML文档的读取、写入和操作功能,对于C++开发者来说,通过COM接口...

    VC++创建与读取XML文件

    读取XML文件主要涉及解析XML文档并访问其内容。通常,我们首先加载XML文件,然后通过`selectNodes`或`selectSingleNode`方法查询XML文档中的节点,最后访问节点的属性和子节点。 例如,读取上面创建的XML文件: ``...

    xml-vc解析xml文档

    本篇将详细讲解如何在VC++中使用MSXML库解析XML文档,以"CHINAmap2008"为例。 首先,我们需要理解MSXML,它是Microsoft XML Core Services的缩写,提供了C++和COM接口来处理XML文档。MSXML包括几个主要组件,如DOM...

    VC++ XML分析类

    MSXML提供了多种接口,如IXMLDOMDocument、IXMLDOMNode等,它们分别对应XML文档对象模型(DOM)的不同部分,可以方便地创建、修改和解析XML文档。 2. **DOM模型**: DOM是XML解析的一种方式,它将XML文档转化为一...

    VC++ 操作 XML 示例

    微软提供的MSXML库是VC++操作XML的主要工具,它包含了几个版本的COM组件,如MSXML2.DOMDocument、MSXML6.DOMDocument等,这些组件提供了XML文档对象模型(DOM)接口,允许程序员创建、修改和解析XML文档。...

    VC++保存与读取XML文件

    在VC++6.0中,我们可以利用微软提供的MSXML库(Microsoft XML Core Services)来处理XML。MSXML提供了一系列的COM接口,包括IXMLDOMDocument、IXMLDOMNode等,使得开发者可以通过C++代码来创建、修改和读取XML文档。...

    vc++ xml操作大全

    - **创建XML文档对象**: 使用`IXMLDOMDocument`接口创建一个XML文档实例,然后可以使用它的方法来加载、保存或创建XML文档。 - **解析XML**: `load`或`loadXML`方法可以用来加载XML文件或XML字符串到内存中。 - *...

    VC++解析XML(内含微软官方SDK)

    本教程将详细介绍如何在VC++中解析XML,主要涉及两种方法:使用微软官方提供的MSXML SDK和使用STL/CLR库。 首先,我们来谈谈MSXML SDK。微软的MSXML(Microsoft XML Core Services)是一个COM组件,它提供了多种...

    VC++实现xml文件操作

    在VC++环境下处理XML文件,通常涉及读取、写入、解析和修改XML文档。本文将深入探讨如何使用VC++来实现这些功能。 一、XML库的选择 在VC++中处理XML,可以选用以下几种库: 1. **Microsoft Foundation Classes ...

    VC 读写XML文件实例运用

    MSXML是微软提供的一个接口,用于解析和创建XML文档,它提供了多种接口,如IXMLDOMDocument,IXMLDOMNode等,用于处理XML节点和属性。而TinyXML则是一个轻量级的库,适用于嵌入式系统和小型应用。 标题中的"VC 读写...

    VC++实现对xml文件的操作

    总结来说,在VC++中处理XML文件,主要涉及到MSXML库的使用,包括创建、加载、解析、修改和保存XML文档。通过IXMLDOMDocument和IXMLDOMNode接口,可以方便地进行各种操作。MFC则提供了更符合其编程风格的类来支持XML...

    使用VC++调用XML

    开发者需要熟悉XML的结构和语法规则,掌握DOM提供的接口,以及如何在VC++中有效地利用MSXML库来实现XML文档的操作。这是一项基础但重要的技能,对于进行复杂的系统集成和数据处理项目非常有价值。

    VC++解析XML完整文件,包括创建,读取,添加,删除

    在VC++中,通常使用MSXML或Windows SDK中的IXMLDOMDocument接口来处理XML文档。 创建XML文件: 1. 引入MSXML库:在你的项目中,需要包含`#import &lt;msxml3.dll&gt;`,这将自动创建MSXML的类型库,使你可以使用DOM模型...

Global site tag (gtag.js) - Google Analytics