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; 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));
程式運行圖。
五、後記
希望本文能給大家協助,歡迎大家批評指正,具體請看原始碼。使用開發包為MSXML3,當然用Apache Xerces原理也是一樣的。