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函数,它们的用途如图所示:
![](https://i-blog.csdnimg.cn/blog_migrate/41e541bd4494d9e943621afe9b98ae2b.png)
三、函数讲解
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; i<l; i++ ) { wchar_t * ln, * vl; int lnl, vll; pAttributes->getLocalName(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));
![](https://i-blog.csdnimg.cn/blog_migrate/d2a592abbcc531940c9cbfa09eb28a11.png)
程序运行图。
五、后记
希望本文能给大家帮助,欢迎大家批评指正,具体请看源代码。使用开发包为MSXML3,当然用Apache Xerces原理也是一样的。