以文本方式查看主题

-  中文XML论坛 - 专业的XML技术讨论区  (http://bbs.xml.org.cn/index.asp)
--  『 DOM/SAX/XPath 』  (http://bbs.xml.org.cn/list.asp?boardid=11)
----  利用VC++与MSXML解析XML文档  (http://bbs.xml.org.cn/dispbbs.asp?boardid=11&rootid=&id=23546)


--  作者:lizlex
--  发布时间:10/25/2005 9:38:00 PM

--  利用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解析相关的事务时节省大量的精力,是一种符合代码重用思想的强有力编程工具。

--  作者:lizlex
--  发布时间:10/25/2005 9:42:00 PM

--  
二、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"的。


--  作者:lizlex
--  发布时间:10/25/2005 9:45:00 PM

--  
三、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方法来设置和获得节点的属性。



此主题相关图片如下:
按此在新窗口浏览图片


--  作者:lizlex
--  发布时间:10/25/2005 10:39:00 PM

--  
四、编程举例

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);
 
}

此主题相关图片如下:
按此在新窗口浏览图片


--  作者:wFirebird
--  发布时间:1/11/2006 1:40:00 PM

--  
如此好的帖子不顶对不起自己~

--  作者:flamingheart
--  发布时间:1/17/2006 2:29:00 PM

--  
确实是好贴,我顶
--  作者:Sally059
--  发布时间:2/11/2006 12:22:00 AM

--  
看了你的帖子才决定注定本论坛的,真好
--  作者:guttas
--  发布时间:2/11/2006 10:56:00 AM

--  
这个是好贴,,顶一下
--  作者:victor110
--  发布时间:2/20/2006 5:27:00 PM

--  
好!太好了!
--  作者:zz277
--  发布时间:4/16/2006 4:40:00 PM

--  
好东东
--  作者:flyskytoday
--  发布时间:4/25/2006 4:12:00 PM

--  
load时,作者和标题无法得出啊~
有啥好方法呢?
--  作者:jnglz
--  发布时间:4/27/2006 9:47:00 AM

--  
太好了,非常感谢,正是我需要的东西哦!谢谢楼主!
--  作者:jnglz
--  发布时间:5/12/2006 8:30:00 AM

--  
谢谢,真的很不错!

--  作者:jnglz
--  发布时间:5/15/2006 8:48:00 AM

--  
我也想问一个问题:现在是得到了book的ID值,如果想要author 和title的值该用什么函数啊?昨天试了好久都不行,谢谢

--  作者:Abner
--  发布时间:5/16/2006 10:06:00 AM

--  
能否给出一些具体使用的例子
--  作者:zhangtianqi
--  发布时间:5/26/2006 10:30:00 AM

--  

下载原程序是对的,只是自己重头建工程按部做后,一按键就显示
“无法创建DOMDocument对象,请检查是否安装了MS XML Parser 运行库!”
为什么无法创建DOMDocument对象,前期还需要那些设定。
我是XML新手,清高手指教,谢谢!!!!!
--  作者:sd3377312
--  发布时间:5/30/2006 5:27:00 PM

--  
好东西啊!我正要用呢!谢谢楼主,最好能给出具体实例.
--  作者:ming4098
--  发布时间:6/6/2006 2:10:00 PM

--  
怎么我下载后运行load的时候报错了,是不正常中止?
--  作者:ynjxxk
--  发布时间:6/8/2006 9:35:00 AM

--  
好东东,就应该大家分享!顶
--  作者:shiliang
--  发布时间:7/7/2006 10:04:00 AM

--  
好呀,不过不知道是不是在EVC下是怎么样进行操作的,在此请教一下,感激不尽!!!
--  作者:joyjjjz
--  发布时间:7/10/2006 2:27:00 PM

--  

看了你的帖子才决定注定本论坛的,真好


--  作者:joyjjjz
--  发布时间:7/10/2006 2:28:00 PM

--  

看了你的帖子才决定注定本论坛的,真好


--  作者:sjz2006
--  发布时间:7/17/2006 6:58:00 PM

--  
使劲顶啊

--  作者:sjz2006
--  发布时间:7/17/2006 6:58:00 PM

--  
再顶!!!
--  作者:daor
--  发布时间:7/24/2006 6:04:00 PM

--  
这个帖子, 不顶能行吗
--  作者:zuhause
--  发布时间:7/28/2006 4:05:00 AM

--  
学习了!
--  作者:longshentailang
--  发布时间:7/29/2006 3:38:00 PM

--  
Perfect!
的确是好东西!
--  作者:fwn7432650
--  发布时间:8/1/2006 5:57:00 PM

--  nice
so nice
--  作者:wangmeijvan
--  发布时间:9/27/2006 11:17:00 AM

--  
找了很久了~~谢谢lz
--  作者:glh1023
--  发布时间:9/29/2006 4:28:00 PM

--  
thank you !
--  作者:liuyasu1117
--  发布时间:11/2/2006 3:54:00 PM

--  
顶!!!!!!!!!!!!NB
--  作者:startbug
--  发布时间:11/17/2006 1:59:00 PM

--  
学习
--  作者:wdxheb
--  发布时间:11/27/2006 10:58:00 AM

--  
我喜欢.
--  作者:cx_hhddy223
--  发布时间:11/28/2006 4:06:00 PM

--  
好,真是需要的,多谢!
--  作者:inanter
--  发布时间:12/8/2006 11:10:00 AM

--  
好,顶一个
--  作者:inanter
--  发布时间:12/8/2006 11:42:00 AM

--  
//创建DOMDocument对象
 HRESULT hr = pDoc.CreateInstance(__uuidof(MSXML2::DOMDocument40));
 if(!SUCCEEDED(hr))
 {  
  MessageBox("无法创建DOMDocument对象,请检查是否安装了MS XML Parser 运行库!");
  return ;
 }

我已安装了msxml3.msi,难道不是这文件?


--  作者:skate
--  发布时间:12/11/2006 1:19:00 PM

--  
up

--  作者:cx_hhddy223
--  发布时间:12/12/2006 3:06:00 PM

--  
thanks a lot!
--  作者:aigo
--  发布时间:2/8/2007 9:36:00 AM

--  
以下是引用lizlex在2005-10-25 21:38:00的发言:
一、文档对象模型(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解析相关的事务时节省大量的精力,是一种符合代码重用思想的强有力编程工具。



--  作者:baboai
--  发布时间:2/15/2007 2:31:00 PM

--  
怎么说呢?解说的很好,有例子使得理解起来更简单
--  作者:nettzar
--  发布时间:2/26/2007 12:50:00 PM

--  
确实是好贴,我顶
--  作者:edward007
--  发布时间:4/4/2007 11:24:00 AM

--  
不错的东西哦,支持一下
--  作者:e1022
--  发布时间:4/4/2007 10:04:00 PM

--  
确实很好,但是为什么使用msxml4.dll呢?
--  作者:sgb349
--  发布时间:4/5/2007 5:26:00 PM

--  
不断关注中……
--  作者:greatken
--  发布时间:4/6/2007 3:59:00 PM

--  
GOOD
--  作者:derry755
--  发布时间:4/9/2007 3:38:00 PM

--  
不错,很有收获
--  作者:minmin0876
--  发布时间:4/25/2007 2:47:00 PM

--  
加油  学习中
--  作者:xeyu
--  发布时间:5/8/2007 10:36:00 PM

--  
谢谢了
--  作者:cheng-liang008
--  发布时间:5/11/2007 2:06:00 PM

--  
hao!
--  作者:hgshc
--  发布时间:5/15/2007 5:34:00 PM

--  
3q
--  作者:tiddy
--  发布时间:6/6/2007 4:36:00 PM

--  
好帖啊,不能不定
--  作者:tiddy
--  发布时间:6/6/2007 4:37:00 PM

--  
支持啊
--  作者:lengse39
--  发布时间:6/22/2007 10:10:00 AM

--  
这个帖子真得特别好, 可是有没有在VC中用SAX解析XML的例子呢?
--  作者:lengse39
--  发布时间:6/22/2007 10:10:00 AM

--  
这个帖子真得特别好, 可是有没有在VC中用SAX解析XML的例子呢?
--  作者:mycatboys
--  发布时间:6/25/2007 10:29:00 PM

--  
好贴啊  收藏了

------------------------------------------------------------------------------
在baidu上找到这个好论坛,[url=http://www.118cy.net/host/]虚拟主机[/url]不错,论坛的[url=http://www.118cy.net/help/webHelp_sql_1011_0.htm]动态主机[/url]的也不错。努力发贴,发贴...呵呵


--  作者:dolphinyuan
--  发布时间:7/17/2007 11:06:00 AM

--  
很不错,谢谢。
--  作者:ftluo2295
--  发布时间:10/18/2007 3:47:00 PM

--  非常不错
非常不错,欢迎大家交流!
E-Mail:ftluo2295@163.com
QQ:27622931
--  作者:ftluo2295
--  发布时间:10/18/2007 3:48:00 PM

--  
非常不错,欢迎大家交流!!!
E-Mail:ftluo2295@163.com
QQ:27629331
--  作者:howen031
--  发布时间:11/20/2007 5:28:00 PM

--  
正要学习XML,好东西,顶起.
--  作者:tweens
--  发布时间:11/21/2007 2:52:00 PM

--  
顶起!
--  作者:kingdream
--  发布时间:11/28/2007 4:43:00 PM

--  
谢谢,也正需要这东西.好好看看.
--  作者:kuerzhao
--  发布时间:12/5/2007 10:02:00 AM

--  
好东西,真的是帮了大忙了
--  作者:lion_xwz
--  发布时间:12/13/2007 4:55:00 PM

--  
谢谢
--  作者:litt
--  发布时间:12/18/2007 9:30:00 PM

--  
下载下来慢慢学习~谢谢分享!
--  作者:achihit
--  发布时间:3/23/2008 3:20:00 PM

--  
我也遇到看同样的问题。

在创建对象之前应该初始化。

CoInitialize(NULL);    //加上这句

HRESULT hr;
hr=pDoc.CreateInstance(__uuidof(DOMDocument40));

这样运行就能得到正确结果。
我是在VC++6.0下用的


--  作者:seanduniv
--  发布时间:5/4/2008 11:21:00 AM

--  
DDDDDDDDD
强贴!
--  作者:peng9527
--  发布时间:5/21/2008 4:00:00 PM

--  
thanks
--  作者:华山虎
--  发布时间:5/23/2008 4:59:00 PM

--  
程序的最好可以显示author和Title的内容吗?
如果能显示那才叫奇怪了。

居然显示出来的结果是attributes


--  作者:lylyjiejie
--  发布时间:7/7/2008 5:03:00 PM

--  
非常好!赞一个!
--  作者:dell1234
--  发布时间:1/10/2009 6:01:00 PM

--  
非常好的XML编程介绍。顶!!!
--  作者:sccxboy
--  发布时间:3/20/2009 10:42:00 AM

--  
如此好贴     我要狂顶
--  作者:seu071189
--  发布时间:4/2/2009 9:39:00 AM

--  
不错不错
--  作者:酸酸果
--  发布时间:4/2/2009 3:18:00 PM

--  
顶!!!!
--  作者:isabc
--  发布时间:6/14/2009 4:09:00 PM

--  
真不错!!!!
--  作者:gz_wood
--  发布时间:8/11/2009 4:53:00 PM

--  
虽然还没看懂, 先顶一个
--  作者:hexun831012
--  发布时间:8/12/2009 9:42:00 PM

--  
最近又捡起了C++,越看越觉得C++垃圾,呵呵
--  作者:chencalla
--  发布时间:1/20/2010 8:29:00 AM

--  
呵呵,谢谢了哦……
--  作者:slvher
--  发布时间:2/22/2010 9:01:00 PM

--  
谢谢楼主分享~
论坛有你更精彩!
--  作者:slvher
--  发布时间:2/22/2010 9:41:00 PM

--  
楼主 你的程序好像有点问题啊
author和title的值没办法显示  
生成xml文档的时候需要输入三个值,load的时候只有ID这个值是真正通过程序载入的,而其它两个值是之前输入时保存好的值,并非通过程序访问xml文档得到,所以点击load按钮时,即使对话框能显示三个值也只是假象。
--  作者:yahoo12345
--  发布时间:3/19/2010 8:40:00 AM

--  
谢谢楼主的分享!很实用 值得学习!谢谢
--  作者:crafet
--  发布时间:4/28/2010 4:15:00 PM

--  
先顶后看,谢谢分享呀
--  作者:rzhgd
--  发布时间:6/12/2011 9:00:00 PM

--  
好东西,顶!
--  作者:sdllaiye
--  发布时间:10/23/2011 11:56:00 AM

--  
喜欢狂顶。。。。。。。。。。。
W 3 C h i n a ( since 2003 ) 旗 下 站 点
苏ICP备05006046号《全国人大常委会关于维护互联网安全的决定》《计算机信息网络国际联网安全保护管理办法》
308.594ms