日期:2014-04-09  浏览次数:21118 次

四、程序实现

  下面通过一个具体的实例来说明在VC++中如何利用MSXML解析XML文档。

  (1)源XML文档(xmlfile.xml)如下:

  <?xml version="1.0" encoding="GB2312"?>
  <Device id="10041" name="设备1">
  <Type>13</Type>
  <TypeName>保护</TypeName>
  </Device>

  我们在源文档中查找"Device",将其"name"属性设置为"测试设备",为其添加"Model"节点,并设置其文本为"3"。

  (2)源程序如下:

  CoInitialize(NULL); // 初始化COM。
  CComPtr<IXMLDOMDocument> spXMLDOM;
  HRESULT hr=spXMLDOM.CoCreateInstance (_uuidof(DOMDocument));
  // 创建解析器实例。
  VARIANT_BOOL bSuccess=false;
  hr=spXMLDOM->load(CComVariant(L"xmlfile.xml"),&bSuccess);
  // 装载XML文档。
  CComBSTR bstrSS(L"Device");
  CComPtr<IXMLDOMNode> spDevice;
  hr=spXMLDOM->selectSingleNode(bstrSS,&spDevice); //搜索"Device"。
  CComQIPtr<IXMLDOMElement> spDev;
  spDev=spDevice;
  // 设置"Device"的"name"属性。
  hr= spDev ->setAttribute(CComBSTR(L"name"),CComVariant("测试设备"));
  CComPtr<IXMLDOMNode> spModelNode; hr=spXMLDOM->createNode(CComVariant(NODE_ELEMENT),ComBSTR
  ("Model"),NULL,& spModelNode); // 创建"Model"节点。
  CComPtr<IXMLDOMNode> spInsertedNode;
  hr=spDevice->appendChild (spModelNode,&spInsertedNode);
  // 添加新节点到"Device"节点下面。
  CString strID="3";
  hr=spInsertedNode->put_text(strID.AllocSysString());// 设置"Model"的文本。
  hr=spXMLDOM->save(CComVariant("xmlfile.xml")); / /保存文档。
  CoUninitialize(); // 结束对COM的使用。

  由于篇幅的缘由,上述代码的每步操作并未对前往的HRESULT类型进行判断,也未进行异常的捕获处理,在实际的编程中读者应依据前往的hr进行决断,以决定程序的流程,同时应进行异常的捕获处理。

  (3) 修正后的XML文档如下

  <?xml version="1.0" encoding="GB2312"?>
  <Device id="10041" name="测试设备">
  <Type>13</Type>
  <TypeName>保护</TypeName>
  <Model>3</Model>
  </Device>

  五、结束语

  由于XML文档有着比HTML更严厉的语法要求,所以使用和编写一个XML解析器要比编写一个HTML解析器要容易得多。同时由于XML文档不只可以 标记文档的显示属性,更重要的是它标记了文档的结构和包含信息的特征,所以我们可以方便地通过XML解析器来获取特定节点的信息并加以显示或修正,方便了 用户对XML文档的操作和维护。同时我们需求留意的是,XML是一种开放的结构体系,并不依赖于任何一家公司,所以开发基于XML的使用必然会得到绝大多 数软件开发平台的支持。  一、 XML 简介

  XML(Xtensible Markup Language,即扩展标记言语)的发展起源于1996年。当时,出版界巨头和Web业内人士经过共同讨论,提出了创建SGML(Standard Generalized Markup Language,即标准通用标识言语)子集(HML)的建议。该子集公用于Web,具有可扩展(或可扩充)性,并且能利用结构化标记言语的所有高级功 能,但摒弃了SGML的复杂性。XML规范的第一份草稿于1996年11月发布后不久,1997年1月首个XML解析器就面世了。随后,便出现了XML的 使用以及新的规范和解析器。

  HTML(Hypertext Markup Language)言语是大家所熟悉的开发网页的一种标记言语,但它不是一种编程言语,它的次要标记是针对文档内容本身结构的描述,因机器本身是不能够解 析它的内容的。XML言语是SGML言语的子集,它保留了SGML次要的使用功用,同时大大减小了SGML的复杂性。它不只能表示文档的内容,而且可以表 示文档的结构,这样在能够被人类理解的同时,也能够被机器所理解。虽然HTML是SGML的一个使用,XML是SGML的一个子集,但是XML绝不是在 HTML上添加某些元素而构成的,它们之间是有很大区别的。最大的区别就是XML允许使用者为某种特殊目的而定义自已的元素。除此之外,另一个最次要的区 别就是XML努力处理的问题,正是在使用HTML时所遇到的一些特殊问题。

  XML要求遵照一定的严厉标准,其分析程序比HTML浏览器对语法和结构的要求愈加严厉。XML文档每次分析的结果都分歧,而HTML在不同的浏览器 中可能会作出不同的分析和显示。同时,XML标准是对数据的处理使用,而不只是针对Web页的,它还可涉及到数据库电子商务系统,以及任何显示系统的高级 使用。开发者可依据特定的工业需求,利用XML创建自定义的数据结构。这些数据结构和数据库可以在许多设备上查看,而不需求使用自定义的接口在不同的显示 设备上查看相反的数据。

  XML次要有三个要素:文档类型声明(DTD:Document Type Declaration)或XML Schema(XML大纲)、可扩展款式言语(XSL:eXtensible Stylesheet Language)和可扩展链接言语(XLink:eXtensible Link Language)。DTD和XML大纲规定了XML文件的逻辑结构,定义了XML文件中的元素、元素的属性以及元素与元素属性之间的关系; Namespace(名域)实现了统一的XML文档数据表示以及数据的互相集成;XSL是用于规定XML文档呈现款式的言语,它使得数据与其表现方式互相 独立,比如XSL能使Web浏览器改变文档的表示法,如数据显示顺序的变化,不需求再与服务器进行通讯。通过改变款式表,同一个文档可以显示得更大,或者 经过折叠只显示外面的一层,或者可以变为打印的格式。而XLink 将进一步扩展目前Web上已有的简单链接。

  二、文档对象模型(DOM)

  DOM是Document Object Model(文档对象模型)的简称,是对Web文档进行使用开发、编程的使用程序接口(API)。作为W3C发布的一种跨平台、与言语无关的接口规范,DOM提供了在不同环境和使用中的标准程序接口,可以用任何言语实现。

  DOM采用对象模型和一系列的接口来描述XML文档的内容和结构,