SaxForm.pas
上传用户:fh681027
上传日期:2022-07-23
资源大小:1959k
文件大小:10k
源码类别:

Delphi控件源码

开发平台:

Delphi

  1. unit SaxForm;
  2. interface
  3. uses
  4.   Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
  5.   StdCtrls, OleServer, MSXML2_TLB, ActiveX, ComObj;
  6. type
  7.   TForm1 = class(TForm)
  8.     Button1: TButton;
  9.     Memo1: TMemo;
  10.     Button2: TButton;
  11.     Button3: TButton;
  12.     procedure Button1Click(Sender: TObject);
  13.     procedure FormCreate(Sender: TObject);
  14.     procedure Button2Click(Sender: TObject);
  15.     procedure Button3Click(Sender: TObject);
  16.   private
  17.     sax: IVBSAXXMLReader;
  18.   public
  19.     procedure ParseFile;
  20.   end;
  21. var
  22.   Form1: TForm1;
  23. implementation
  24. {$R *.DFM}
  25. var
  26.   Log: TStrings;
  27. type
  28.   TMySaxHandler = class (TInterfacedObject, IVBSAXContentHandler)
  29.   protected
  30.     stack: TStringList;
  31.   public
  32.     constructor Create;
  33.     destructor Destroy; override;
  34.     // IDispatch
  35.     function GetTypeInfoCount(out Count: Integer): HResult; stdcall;
  36.     function GetTypeInfo(Index, LocaleID: Integer; out TypeInfo): HResult; stdcall;
  37.     function GetIDsOfNames(const IID: TGUID; Names: Pointer;
  38.       NameCount, LocaleID: Integer; DispIDs: Pointer): HResult; stdcall;
  39.     function Invoke(DispID: Integer; const IID: TGUID; LocaleID: Integer;
  40.       Flags: Word; var Params; VarResult, ExcepInfo, ArgErr: Pointer): HResult; stdcall;
  41.     // IVBSAXContentHandler
  42.     procedure Set_documentLocator(const Param1: IVBSAXLocator); virtual; safecall;
  43.     procedure startDocument; virtual; safecall;
  44.     procedure endDocument; virtual; safecall;
  45.     procedure startPrefixMapping(var strPrefix: WideString; var strURI: WideString); virtual; safecall;
  46.     procedure endPrefixMapping(var strPrefix: WideString); virtual; safecall;
  47.     procedure startElement(var strNamespaceURI: WideString; var strLocalName: WideString;
  48.                            var strQName: WideString; const oAttributes: IVBSAXAttributes); virtual; safecall;
  49.     procedure endElement(var strNamespaceURI: WideString; var strLocalName: WideString;
  50.                          var strQName: WideString); virtual; safecall;
  51.     procedure characters(var strChars: WideString); virtual; safecall;
  52.     procedure ignorableWhitespace(var strChars: WideString); virtual; safecall;
  53.     procedure processingInstruction(var strTarget: WideString; var strData: WideString); virtual; safecall;
  54.     procedure skippedEntity(var strName: WideString); virtual; safecall;
  55.   end;
  56.   TMySimpleSaxHandler = class (TMySaxHandler)
  57.   public
  58.     procedure startElement(var strNamespaceURI: WideString; var strLocalName: WideString;
  59.                            var strQName: WideString; const oAttributes: IVBSAXAttributes); override; safecall;
  60.     procedure characters(var strChars: WideString); override; safecall;
  61.   end;
  62.   TMyBooksListSaxHandler = class (TMySaxHandler)
  63.   private
  64.     isBook: Boolean;
  65.   public
  66.     procedure startElement(var strNamespaceURI: WideString; var strLocalName: WideString;
  67.                            var strQName: WideString; const oAttributes: IVBSAXAttributes); override; safecall;
  68.     procedure characters(var strChars: WideString); override; safecall;
  69.   end;
  70.   TMySaxErrorHandler = class (TInterfacedObject, IVBSAXErrorHandler)
  71.   public
  72.     // IDispatch
  73.     function GetTypeInfoCount(out Count: Integer): HResult; stdcall;
  74.     function GetTypeInfo(Index, LocaleID: Integer; out TypeInfo): HResult; stdcall;
  75.     function GetIDsOfNames(const IID: TGUID; Names: Pointer;
  76.       NameCount, LocaleID: Integer; DispIDs: Pointer): HResult; stdcall;
  77.     function Invoke(DispID: Integer; const IID: TGUID; LocaleID: Integer;
  78.       Flags: Word; var Params; VarResult, ExcepInfo, ArgErr: Pointer): HResult; stdcall;
  79.     // IVBSAXErrorHandler
  80.     procedure error(const oLocator: IVBSAXLocator; var strErrorMessage: WideString;
  81.                     nErrorCode: Integer); safecall;
  82.     procedure fatalError(const oLocator: IVBSAXLocator; var strErrorMessage: WideString;
  83.                          nErrorCode: Integer); safecall;
  84.     procedure ignorableWarning(const oLocator: IVBSAXLocator; var strErrorMessage: WideString;
  85.                                nErrorCode: Integer); safecall;
  86.   end;
  87. procedure TForm1.Button1Click(Sender: TObject);
  88. begin
  89.   Memo1.Clear;
  90.   sax.ContentHandler := TMySaxHandler.Create;
  91.   ParseFile;
  92. end;
  93. procedure TForm1.FormCreate(Sender: TObject);
  94. begin
  95.   Log := Memo1.Lines;
  96.   // create sax and connect error handler
  97.   sax := CreateComObject (CLASS_SAXXMLReader) as IVBSAXXMLReader;
  98.   sax.ErrorHandler := TMySaxErrorHandler.Create;
  99. end;
  100. { TMySaxHandler }
  101. function RemoveWhites (str: WideString): WideString;
  102. var
  103.   i: integer;
  104. begin
  105.   for i := 1 to Length (str) do
  106.     if Ord(str[i]) >= 32 then
  107.       Result := Result + str [i];
  108.   Result := Trim (Result);
  109. end;
  110. procedure TMySaxHandler.characters(var strChars: WideString);
  111. begin
  112. end;
  113. constructor TMySaxHandler.Create;
  114. begin
  115.   stack := TStringList.Create;
  116. end;
  117. destructor TMySaxHandler.Destroy;
  118. begin
  119.   inherited;
  120.   stack.Free;
  121. end;
  122. procedure TMySaxHandler.endDocument;
  123. begin
  124.   Log.Add ('--- endDocument ---');
  125. end;
  126. procedure TMySaxHandler.endElement(var strNamespaceURI, strLocalName,
  127.   strQName: WideString);
  128. begin
  129.   stack.Delete (stack.Count - 1);
  130. end;
  131. procedure TMySaxHandler.endPrefixMapping(var strPrefix: WideString);
  132. begin
  133. end;
  134. function TMySaxHandler.GetIDsOfNames(const IID: TGUID; Names: Pointer;
  135.   NameCount, LocaleID: Integer; DispIDs: Pointer): HResult;
  136. begin
  137.   Result := E_NOTIMPL;
  138. end;
  139. function TMySaxHandler.GetTypeInfo(Index, LocaleID: Integer;
  140.   out TypeInfo): HResult;
  141. begin
  142.   Result := E_NOTIMPL;
  143. end;
  144. function TMySaxHandler.GetTypeInfoCount(out Count: Integer): HResult;
  145. begin
  146.   Result := E_NOTIMPL;
  147. end;
  148. procedure TMySaxHandler.ignorableWhitespace(var strChars: WideString);
  149. begin
  150. end;
  151. function TMySaxHandler.Invoke(DispID: Integer; const IID: TGUID;
  152.   LocaleID: Integer; Flags: Word; var Params; VarResult, ExcepInfo,
  153.   ArgErr: Pointer): HResult;
  154. begin
  155.   Result := E_NOTIMPL;
  156. end;
  157. procedure TMySaxHandler.processingInstruction(var strTarget,
  158.   strData: WideString);
  159. begin
  160. end;
  161. procedure TMySaxHandler.Set_documentLocator(const Param1: IVBSAXLocator);
  162. begin
  163. end;
  164. procedure TMySaxHandler.skippedEntity(var strName: WideString);
  165. begin
  166. end;
  167. procedure TMySaxHandler.startDocument;
  168. begin
  169.   Log.Add ('--- startDocument ---');
  170. end;
  171. procedure TMySaxHandler.startElement(var strNamespaceURI, strLocalName,
  172.   strQName: WideString; const oAttributes: IVBSAXAttributes);
  173. begin
  174.   stack.Add (strLocalName);
  175. end;
  176. procedure TMySaxHandler.startPrefixMapping(var strPrefix,
  177.   strURI: WideString);
  178. begin
  179. end;
  180. { TMySaxErrorHandler }
  181. procedure TMySaxErrorHandler.error(const oLocator: IVBSAXLocator;
  182.   var strErrorMessage: WideString; nErrorCode: Integer);
  183. begin
  184.   Log.Add ('[Error] ' +
  185.     IntToStr (oLocator.lineNumber) + '.' + IntToStr (oLocator.columnNumber) + ':' +
  186.     strErrorMessage);
  187. end;
  188. procedure TMySaxErrorHandler.fatalError(const oLocator: IVBSAXLocator;
  189.   var strErrorMessage: WideString; nErrorCode: Integer);
  190. begin
  191.   Log.Add ('[Fatal] ' +
  192.     IntToStr (oLocator.lineNumber) + '.' + IntToStr (oLocator.columnNumber) + ':' +
  193.     strErrorMessage);
  194. end;
  195. function TMySaxErrorHandler.GetIDsOfNames(const IID: TGUID; Names: Pointer;
  196.   NameCount, LocaleID: Integer; DispIDs: Pointer): HResult;
  197. begin
  198.   Result := E_NOTIMPL;
  199. end;
  200. function TMySaxErrorHandler.GetTypeInfo(Index, LocaleID: Integer;
  201.   out TypeInfo): HResult;
  202. begin
  203.   Result := E_NOTIMPL;
  204. end;
  205. function TMySaxErrorHandler.GetTypeInfoCount(out Count: Integer): HResult;
  206. begin
  207.   Result := E_NOTIMPL;
  208. end;
  209. procedure TMySaxErrorHandler.ignorableWarning(
  210.   const oLocator: IVBSAXLocator; var strErrorMessage: WideString;
  211.   nErrorCode: Integer);
  212. begin
  213.   Log.Add ('[Warning] ' +
  214.     IntToStr (oLocator.lineNumber) + '.' + IntToStr (oLocator.columnNumber) + ':' +
  215.     strErrorMessage);
  216. end;
  217. function TMySaxErrorHandler.Invoke(DispID: Integer; const IID: TGUID;
  218.   LocaleID: Integer; Flags: Word; var Params; VarResult, ExcepInfo,
  219.   ArgErr: Pointer): HResult;
  220. begin
  221.   Result := E_NOTIMPL;
  222. end;
  223. { TMySimpleSaxHandler }
  224. procedure TMySimpleSaxHandler.characters(var strChars: WideString);
  225. var
  226.   str: WideString;
  227. begin
  228.   inherited;
  229.   str := RemoveWhites (strChars);
  230.   if (str <> '') then
  231.     Log.Add ('Text: ' + str);
  232. end;
  233. procedure TMySimpleSaxHandler.startElement(var strNamespaceURI,
  234.   strLocalName, strQName: WideString; const oAttributes: IVBSAXAttributes);
  235. begin
  236.   inherited;
  237.   Log.Add (strLocalName + '(' + stack.CommaText + ')');
  238. end;
  239. { TMyBooksListSaxHandler }
  240. procedure TMyBooksListSaxHandler.characters(var strChars: WideString);
  241. var
  242.   str: string;
  243. begin
  244.   inherited;
  245.   if isbook then
  246.   begin
  247.     str := RemoveWhites (strChars);
  248.     if (str <> '') then
  249.       Log.Add (stack.CommaText + ': ' + str);
  250.   end;
  251. end;
  252. procedure TMyBooksListSaxHandler.startElement(var strNamespaceURI,
  253.   strLocalName, strQName: WideString; const oAttributes: IVBSAXAttributes);
  254. begin
  255.   inherited;
  256.   isbook := (strLocalName = 'title');
  257. end;
  258. procedure TForm1.ParseFile;
  259. var
  260.   filename: string;
  261. begin
  262.   filename := ExtractFilePath (Application.Exename) + 'books.xml';
  263.   if FileExists (filename) then
  264.   begin
  265.     sax.parseURL (filename)
  266.   end
  267.   else
  268.     Log.Add ('file not found: ' + filename);
  269. end;
  270. procedure TForm1.Button2Click(Sender: TObject);
  271. begin
  272.   Memo1.Clear;
  273.   sax.ContentHandler := TMySimpleSaxHandler.Create;
  274.   ParseFile;
  275. end;
  276. procedure TForm1.Button3Click(Sender: TObject);
  277. begin
  278.   Memo1.Clear;
  279.   sax.ContentHandler := TMyBooksListSaxHandler.Create;
  280.   ParseFile;
  281. end;
  282. end.