新书推介:《语义网技术体系》
作者:瞿裕忠,胡伟,程龚
   XML论坛     W3CHINA.ORG讨论区     计算机科学论坛     SOAChina论坛     Blog     开放翻译计划     新浪微博  
 
  • 首页
  • 登录
  • 注册
  • 软件下载
  • 资料下载
  • 核心成员
  • 帮助
  •   Add to Google

    >> 本版讨论DOM, SAX, XPath等。
    [返回] 中文XML论坛 - 专业的XML技术讨论区XML.ORG.CN讨论区 - XML技术『 DOM/SAX/XPath 』 → 利用VC++与MSXML解析XML文档 查看新帖用户列表

      发表一个新主题  发表一个新投票  回复主题  (订阅本版) 您是本帖的第 279294 个阅读者浏览上一篇主题  刷新本主题   树形显示贴子 浏览下一篇主题
     * 贴子主题: 利用VC++与MSXML解析XML文档 举报  打印  推荐  IE收藏夹 
       本主题类别:     
     lizlex 帅哥哟,离线,有人找我吗?
      
      
      等级:大一(高数修炼中)
      文章:24
      积分:189
      门派:XML.ORG.CN
      注册:2005/10/13

    姓名:(无权查看)
    城市:(无权查看)
    院校:(无权查看)
    给lizlex发送一个短消息 把lizlex加入好友 查看lizlex的个人资料 搜索lizlex在『 DOM/SAX/XPath 』的所有贴子 引用回复这个贴子 回复这个贴子 查看lizlex的博客楼主
    发贴心情 利用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解析相关的事务时节省大量的精力,是一种符合代码重用思想的强有力编程工具。

       收藏   分享  
    顶(2)
      




    点击查看用户来源及管理<br>发贴IP:*.*.*.* 2005/10/25 21:38:00
     
     lizlex 帅哥哟,离线,有人找我吗?
      
      
      等级:大一(高数修炼中)
      文章:24
      积分:189
      门派:XML.ORG.CN
      注册:2005/10/13

    姓名:(无权查看)
    城市:(无权查看)
    院校:(无权查看)
    给lizlex发送一个短消息 把lizlex加入好友 查看lizlex的个人资料 搜索lizlex在『 DOM/SAX/XPath 』的所有贴子 引用回复这个贴子 回复这个贴子 查看lizlex的博客2
    发贴心情 
    二、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"的。

    点击查看用户来源及管理<br>发贴IP:*.*.*.* 2005/10/25 21:42:00
     
     lizlex 帅哥哟,离线,有人找我吗?
      
      
      等级:大一(高数修炼中)
      文章:24
      积分:189
      门派:XML.ORG.CN
      注册:2005/10/13

    姓名:(无权查看)
    城市:(无权查看)
    院校:(无权查看)
    给lizlex发送一个短消息 把lizlex加入好友 查看lizlex的个人资料 搜索lizlex在『 DOM/SAX/XPath 』的所有贴子 引用回复这个贴子 回复这个贴子 查看lizlex的博客3
    发贴心情 
    三、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方法来设置和获得节点的属性。



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

    点击查看用户来源及管理<br>发贴IP:*.*.*.* 2005/10/25 21:45:00
     
     lizlex 帅哥哟,离线,有人找我吗?
      
      
      等级:大一(高数修炼中)
      文章:24
      积分:189
      门派:XML.ORG.CN
      注册:2005/10/13

    姓名:(无权查看)
    城市:(无权查看)
    院校:(无权查看)
    给lizlex发送一个短消息 把lizlex加入好友 查看lizlex的个人资料 搜索lizlex在『 DOM/SAX/XPath 』的所有贴子 引用回复这个贴子 回复这个贴子 查看lizlex的博客4
    发贴心情 
    四、编程举例

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

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

    点击查看用户来源及管理<br>发贴IP:*.*.*.* 2005/10/25 22:39:00
     
     wFirebird 帅哥哟,离线,有人找我吗?
      
      
      等级:大二(研究汇编)
      文章:32
      积分:227
      门派:XML.ORG.CN
      注册:2006/1/10

    姓名:(无权查看)
    城市:(无权查看)
    院校:(无权查看)
    给wFirebird发送一个短消息 把wFirebird加入好友 查看wFirebird的个人资料 搜索wFirebird在『 DOM/SAX/XPath 』的所有贴子 引用回复这个贴子 回复这个贴子 查看wFirebird的博客5
    发贴心情 
    如此好的帖子不顶对不起自己~
    点击查看用户来源及管理<br>发贴IP:*.*.*.* 2006/1/11 13:40:00
     
     flamingheart 帅哥哟,离线,有人找我吗?
      
      
      等级:大一新生
      文章:11
      积分:93
      门派:XML.ORG.CN
      注册:2005/8/12

    姓名:(无权查看)
    城市:(无权查看)
    院校:(无权查看)
    给flamingheart发送一个短消息 把flamingheart加入好友 查看flamingheart的个人资料 搜索flamingheart在『 DOM/SAX/XPath 』的所有贴子 引用回复这个贴子 回复这个贴子 查看flamingheart的博客6
    发贴心情 
    确实是好贴,我顶
    点击查看用户来源及管理<br>发贴IP:*.*.*.* 2006/1/17 14:29:00
     
     Sally059 美女呀,离线,快来找我吧!
      
      
      等级:大一新生
      文章:0
      积分:55
      门派:XML.ORG.CN
      注册:2006/2/11

    姓名:(无权查看)
    城市:(无权查看)
    院校:(无权查看)
    给Sally059发送一个短消息 把Sally059加入好友 查看Sally059的个人资料 搜索Sally059在『 DOM/SAX/XPath 』的所有贴子 引用回复这个贴子 回复这个贴子 查看Sally059的博客7
    发贴心情 
    看了你的帖子才决定注定本论坛的,真好
    点击查看用户来源及管理<br>发贴IP:*.*.*.* 2006/2/11 0:22:00
     
     guttas 帅哥哟,离线,有人找我吗?
      
      
      等级:大一新生
      文章:1
      积分:59
      门派:XML.ORG.CN
      注册:2005/12/12

    姓名:(无权查看)
    城市:(无权查看)
    院校:(无权查看)
    给guttas发送一个短消息 把guttas加入好友 查看guttas的个人资料 搜索guttas在『 DOM/SAX/XPath 』的所有贴子 引用回复这个贴子 回复这个贴子 查看guttas的博客8
    发贴心情 
    这个是好贴,,顶一下
    点击查看用户来源及管理<br>发贴IP:*.*.*.* 2006/2/11 10:56:00
     
     victor110 帅哥哟,离线,有人找我吗?
      
      
      等级:大一新生
      文章:0
      积分:54
      门派:XML.ORG.CN
      注册:2006/2/20

    姓名:(无权查看)
    城市:(无权查看)
    院校:(无权查看)
    给victor110发送一个短消息 把victor110加入好友 查看victor110的个人资料 搜索victor110在『 DOM/SAX/XPath 』的所有贴子 引用回复这个贴子 回复这个贴子 查看victor110的博客9
    发贴心情 
    好!太好了!
    点击查看用户来源及管理<br>发贴IP:*.*.*.* 2006/2/20 17:27:00
     
     zz277 帅哥哟,离线,有人找我吗?
      
      
      等级:大一(猛啃高等数学)
      文章:24
      积分:127
      门派:XML.ORG.CN
      注册:2006/4/10

    姓名:(无权查看)
    城市:(无权查看)
    院校:(无权查看)
    给zz277发送一个短消息 把zz277加入好友 查看zz277的个人资料 搜索zz277在『 DOM/SAX/XPath 』的所有贴子 引用回复这个贴子 回复这个贴子 查看zz277的博客10
    发贴心情 
    好东东
    点击查看用户来源及管理<br>发贴IP:*.*.*.* 2006/4/16 16:40:00
     
     GoogleAdSense
      
      
      等级:大一新生
      文章:1
      积分:50
      门派:无门无派
      院校:未填写
      注册:2007-01-01
    给Google AdSense发送一个短消息 把Google AdSense加入好友 查看Google AdSense的个人资料 搜索Google AdSense在『 DOM/SAX/XPath 』的所有贴子 访问Google AdSense的主页 引用回复这个贴子 回复这个贴子 查看Google AdSense的博客广告
    2020/10/27 17:31:48

    本主题贴数83,分页: [1] [2] [3] [4]... [9]

    管理选项修改tag | 锁定 | 解锁 | 提升 | 删除 | 移动 | 固顶 | 总固顶 | 奖励 | 惩罚 | 发布公告
    W3C Contributing Supporter! W 3 C h i n a ( since 2003 ) 旗 下 站 点
    苏ICP备05006046号《全国人大常委会关于维护互联网安全的决定》《计算机信息网络国际联网安全保护管理办法》
    156.250ms