游子的博客
慈母手中线,游子身上衣, 临行密密缝,意恐迟迟归, 谁言寸草心,报得三春晖。 数据读取中,请稍候......
posts - 337,  comments - 546,  trackbacks - 0
 从理论上说,根据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);
 
}

posted on 2006-09-15 10:43 游子 阅读(1205) 评论(0)  编辑 收藏 引用 所属分类: 软件
只有注册用户登录后才能发表评论。

欢迎大家扔鸡蛋!送鲜花!

博客可以收入过千吗?

<2006年9月>
日一二三四五六27282930311
234567891011121314151617181920212223242526272829301234567

常用链接

留言簿(8)

随笔分类(314)

随笔档案(337)

文章分类(7)

文章档案(10)

相册

收藏夹(1)

其它

友情链接

数字电视

生活、旅游

自己的链接

计算机

搜索

  •  

积分与排名

  • 积分 - 403154
  • 排名 - 9

最新评论

阅读排行榜

评论排行榜