Chinaunix首页 | 论坛 | 博客
  • 博客访问: 378729
  • 博文数量: 715
  • 博客积分: 40000
  • 博客等级: 大将
  • 技术积分: 5005
  • 用 户 组: 普通用户
  • 注册时间: 2008-10-13 14:46
文章分类

全部博文(715)

文章存档

2011年(1)

2008年(714)

我的朋友

分类:

2008-10-13 16:37:30

XML 初级教程(二)

作者:



一、SAX架构
SAX包含多个Handler处理器,其中有诸多函数以处理XML资源的时侯处理事件。
其中ContentHandler是最重要的,它用来对XML文档进行解析,DTDHandler则对DTD文件进行验证。
当前MSXML3包含以下处理器:

  • IMXAttributes Interface
  • IMXWriter Interface
  • ISAXAttributes Interface
  • ISAXContentHandler Interface
  • ISAXDeclHandler Interface
  • ISAXDTDHandler Interface
  • ISAXEntityResolver Interface
  • ISAXErrorHandler Interface
  • ISAXLexicalHandler Interface
  • ISAXLocator Interface
  • ISAXXMLFilter Interface
  • ISAXXMLReader Interface

二、ISAXContentHandler接口
ContentHandler拥有以下函数:
characters endDocument startDocument endElement startElement
ignorableWhitespace startPrefixMapping processingInstruction skippedEntity  

今天要讲解的函数是characters,startDocument/endDoucment,startElement/endElement函数,它们的用途如图所示:

三、函数讲解
HRESULT characters(
   [in] const wchar_t * pwchChars,
   [in] int cchChars);
   pwchChars获取字符串信息。
   cchChars获取该字符串长度。
   
HRESULT startDocument();
   该函数表明开始解析文档。
HRESULT startElement(
   [in] const wchar_t * pwchNamespaceUri, 
   [in] int cchNamespaceUri, 
   [in] const wchar_t * pwchLocalName, 
   [in] int cchLocalName
   [in] const wchar_t * 
   [in] int cchQName);
   [in] ISAXAttributes * pAttributes); 
   pwchNamespaceUri获取命名空间URI。
   cchNamespaceUri获取URI的长度。
   pwchLocalName获取标记。
   cchLocalName获取标记长度。
   pwchQName获取QName。
   cchQName获取QName长度。
   pAttributes获取元素属性信息。	   
   
	
  由于元素属性并不固定,需要用如下方法获取。
   pAttributes->getLength(&l);
   for ( int i=0; igetLocalName(i,&ln,&lnl); 
      prt(L" %s=", ln, lnl);
      pAttributes->getValue(i,&vl,&vll);
      prt(L"\"%s\"", vl, vll);
   }
四、 使用ContentHandler:
	HERO_XMLContentHandler* pHero_XML;
	ISAXXMLReaderPtr pReader = NULL;
	HRESULT hr;
	CHR(pReader.CreateInstance(__uuidof(SAXXMLReader))); 
	//Only one content handler can be registered at a time.
	pHero_XML=HERO_XMLContentHandler::CreateInstance();	//生成HERO_XMLContentHandler对象。
	CHR(pReader->putContentHandler(pHero_XML));	//注册HERO_XMLContentHandler处理器。
	CHR(pReader->parseURL(L"hero.xml"));//解析路径。
	CHR(pReader->putContentHandler(NULL));

程序运行图。

五、后记

希望本文能给大家帮助,欢迎大家批评指正,具体请看源代码。使用开发包为MSXML3,当然用Apache Xerces原理也是一样的。


--------------------next---------------------

那就别看了,作者写得多好,我来回答一楼的问题:1,XML简单的说是数据交换的标准(不仅是文件格式)。2,XML是一种界定文本数据的简便而标准的方法。它曾经被人称作“ We b上的A S C I I码”。就好像你可以使用自己喜爱的编程语言来创建任何一种数据结构,然后同其他人在其他计算平台上使用的其他语言来共享一样。XML的标记用来说明你所描述的概念,而属性则用来控制它们
的结构。所以,你可以定义自己所设计出的语法并同其他人共享。3,参考2条。 ( mingren_2000 发表于 2006-10-22 21:41:00)
 
就是,看了像是白看。 ( kyos 发表于 2006-3-30 11:07:00)
 
现在关于XML的文章书籍满天飞,我就是没搞明白究竟这是个什么东东。请教:1.XML是干嘛用的?2.我为什么要用XML,而不用其它技术?3.是否XML可以解决一些用其它方法很难解决的问题? ( seabluescn 发表于 2005-8-6 22:27:00)
 
.......................................................

--------------------next---------------------

阅读(139) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~