5 \brief XMLIntf, XMLDoc
\82 \82½
\82è
\82Ì
\83N
\83\8d\81[
\83\93<br>
8 $Id: GikoXMLDoc.pas,v 1.10 2004/10/09 15:07:20 yoffy Exp $
12 //==================================================
14 //==================================================
16 Classes, SysUtils, Windows,
19 //==================================================
21 //==================================================
23 //
\82í
\82¯
\82í
\82©
\82ç
\82¸
\8dì
\82Á
\82Ä
\82é
\82©
\82ç
\83o
\83O
\82¾
\82ç
\82¯
\82©
\82à
24 XMLDictionary = Record
34 FAttributeCount : Integer;
35 FChildNodes : IXMLNode;
36 FNodes : array of IXMLNode;
37 FAttributes : array of XMLDictionary;
38 function GetAttribute( const Name : string ) : string;
39 function GetNode( Index : Integer ) : IXMLNode;
42 destructor Destroy; override;
44 property NodeName : string read FNodeName write FNodeName;
45 property Attributes[ const Name : string ] : string read GetAttribute;
46 property Node[ Index : Integer ] : IXMLNode read GetNode; default;
47 property ChildNodes : IXMLNode read FChildNodes write FChildNodes;
48 property Count : Integer read FCount write FCount;
49 procedure Add( node : IXMLNode );
50 procedure AddAttribute( const Name : string; const Value : string );
53 IXMLDocument = class( IXMLNode )
55 function GetDocumentElement() : IXMLNode;
57 property DocumentElement : IXMLNode read GetDocumentElement;
60 function XMLCloseCheck(
65 out closed : boolean //
\8cÄ
\82Ñ
\8fo
\82µ
\82½
\83\8b\81[
\83`
\83\93\82ª node
\82ð
\95Â
\82¶
\82é
\82×
\82«
\82È
\82ç true
66 ) : boolean; // ch
\82ð
\82±
\82Ì
\83\8b\81[
\83`
\83\93\82ª
\8f\88\97\9d\82µ
\82½
\82È
\82ç true
72 ) : string; // node
\88È
\8aO
\82Ì
\83m
\81[
\83h
\82ª
\95Â
\82¶
\82ç
\82ê
\82½
\8fê
\8d\87\82Ì
\83m
\81[
\83h
\96¼
74 procedure LoadXMLDocument(
75 const fileName : string;
76 var doc : IXMLDocument
79 //==================================================
81 //==================================================
82 kXMLWhite : TSysCharSet = [#0..#$20];
83 kXMLNodeNameStop : TSysCharSet = [#0..#$20, '/', '>'];
84 kXMLAttributeNameStop : TSysCharSet = [#0..#$20, '=', '/', '>'];
85 kXMLDQuote : TSysCharSet = ['"'];
86 kXMLTagStart : TSysCharSet = ['<'];
87 kXMLTagEnd : TSysCharSet = ['>'];
88 kXMLKanji : TSysCharSet = [#$81..#$9f, #$E0..#$fc];
90 //==================================================
92 //==================================================
95 constructor IXMLNode.Create;
106 destructor IXMLNode.Destroy;
111 for i := FCount - 1 downto 0 do
119 function IXMLNode.GetAttribute( const Name : string ) : string;
125 while i < FAttributeCount do
127 if Name = FAttributes[ i ].Name then
129 Result := FAttributes[ i ].Value;
138 function IXMLNode.GetNode( Index : Integer ) : IXMLNode;
141 Result := FNodes[ Index ];
145 procedure IXMLNode.Add( node : IXMLNode );
149 if FCount > FCapacity then begin
150 FCapacity := FCapacity + (FCapacity shr 2) + 1;
151 SetLength( FNodes, FCapacity );
154 FNodes[ FCount - 1 ] := node;
158 procedure IXMLNode.AddAttribute(
166 index := FAttributeCount;
167 Inc( FAttributeCount );
168 SetLength( FAttributes, FAttributeCount );
170 FAttributes[ index ].Name := Name;
171 FAttributes[ index ].Value := Value;
175 function IXMLDocument.GetDocumentElement() : IXMLNode;
178 Result := FChildNodes[ 0 ];
183 \brief tok
\82ð
\92T
\82·
184 \param p
\92T
\8dõ
\8aJ
\8en
\88Ê
\92u
185 \param tail
\8fI
\97¹
\88Ê
\92u + 1
186 \param tok
\92T
\82·
\83L
\83\83\83\89\83N
\83^
187 \return tok
\82ª
\8dÅ
\8f\89\82É
\8c©
\82Â
\82©
\82Á
\82½
\88Ê
\92u
192 const tok : TSysCharSet
201 end else if p^ in kXMLKanji then
212 \brief tok
\82Å
\82Í
\96³
\82¢
\83L
\83\83\83\89\83N
\83^
\82ð
\92T
\82·
213 \param p
\92T
\8dõ
\8aJ
\8en
\88Ê
\92u
214 \param tail
\8fI
\97¹
\88Ê
\92u + 1
215 \param tok
\92T
\82·
\83L
\83\83\83\89\83N
\83^
216 \return tok
\82Å
\82Í
\82È
\82¢
\83L
\83\83\83\89\83N
\83^
\82ª
\8dÅ
\8f\89\82É
\8c©
\82Â
\82©
\82Á
\82½
\88Ê
\92u
218 function AnsiStrNonTok(
221 const tok : TSysCharSet
229 if p^ in kXMLKanji then
242 function XMLCloseCheck(
248 ) : boolean; // ch
\82ð
\82±
\82Ì
\83\8b\81[
\83`
\83\93\82ª
\8f\88\97\9d\82µ
\82½
\82È
\82ç true
260 //
\8aJ
\8en
\83^
\83O
\82Ì
\8dÅ
\8cã
\82Ü
\82Å
\93Ç
\82ñ
\82¾
261 Inc( p ); // '>'
\94ò
\82Î
\82µ
267 // <?xml?>
\82Ý
\82½
\82¢
\82È
\82â
\82Â
\81B
\82æ
\82Á
\82Ä
\96³
\8e\8b
268 p := AnsiStrTok( p, tail, kXMLTagEnd );
269 p := AnsiStrTok( p, tail, kXMLTagStart );
270 Inc( p ); // '<'
\94ò
\82Î
\82µ
271 p := AnsiStrNonTok( p, tail, kXMLWhite );
278 //
\83^
\83O
\96¼
\82ð
\93Ç
\82Ý
\8d\9e\82ñ
\82Å
\95Ô
\82·
279 Inc( p ); // '/'
\94ò
\82Î
\82µ
280 found := AnsiStrTok( p, tail, kXMLTagEnd );
281 // tag := Copy( p, 0, found - p ); //
\89½
\8cÌ
\82©
\8c\83\92x
282 SetLength( tag, found - p );
283 CopyMemory( PChar( tag ), p, found - p );
285 p := found + 1; // '>'
\94ò
\82Î
\82µ
293 function XMLReadNode(
297 ) : string; // node
\88È
\8aO
\82Ì
\83m
\81[
\83h
\82ª
\95Â
\82¶
\82ç
\82ê
\82½
\8fê
\8d\87\82Ì
\83m
\81[
\83h
\96¼
307 attributeName : string;
308 attributeValue : string;
313 // node
\82Ì
\93Ç
\82Ý
\8d\9e\82Ý(1
\83\8b\81[
\83v
\82É
\82Â
\82« 1
\83m
\81[
\83h)
314 node.ChildNodes := IXMLNode.Create;
318 // NodeName
\93Ç
\82Ý
\8d\9e\82Ý
319 p := AnsiStrNonTok( p, tail, kXMLWhite );
323 if XMLCloseCheck( p, tail, node, tag, isClosed ) then
332 end else if p^ = '<' then
334 //
\90V
\8bK
\83m
\81[
\83h
336 child := IXMLNode.Create;
337 tag := XMLReadNode( p, tail, child );
338 node.ChildNodes.Add( child );
340 //
\83^
\83O
\82ª
\95Â
\82¶
\82ç
\82ê
\82½
341 if Length( tag ) > 0 then
343 //
\8e©
\95ª
\82Ì
\82à
\82Ì
\82©
\83`
\83F
\83b
\83N
\82µ
\82Ä
\81A
\88á
\82¦
\82Î
\90e
\82É
\95Ô
\82·
344 if tag <> node.NodeName then
350 end else if p^ in kXMLWhite then
355 found := AnsiStrTok( p, tail, kXMLNodeNameStop );
356 SetLength( nodeName, found - p );
357 CopyMemory( PChar( nodeName ), p, found - p );
358 node.NodeName := nodeName;
364 // Attribute
\82Ì
\93Ç
\82Ý
\8d\9e\82Ý
367 // Attribute
\82Ì
\96¼
\91O
\82ð
\93Ç
\82Ý
\8d\9e\82Ý
369 attributeValue := '';
371 p := AnsiStrNonTok( p, tail, kXMLWhite );
375 if XMLCloseCheck( p, tail, node, tag, isClosed ) then
379 //
\83^
\83O
\82ª
\95Â
\82¶
\82ç
\82ê
\82½
\82Ì
\82Å
\83\8a\83^
\81[
\83\93
380 //
\81¦NodeName
\82ð
\92Ê
\89ß
\82µ
\82Ä
\82é
\82Ì
\82Å
\93r
\92\86\82Å
\95Â
\82¶
\82Ä
\82é
\82±
\82Æ
\82É
\82È
\82é
\81B
381 //
\82æ
\82Á
\82Ä
\93Æ
\97§
\83m
\81[
\83h
\81B
385 //
\8e\9f\82Ì
\83m
\81[
\83h
\82Ö
387 end else if p^ = '=' then
389 //
\82±
\82±
\82©
\82ç
\82Í
\92l
\82ª
\8en
\82Ü
\82é
\82Ì
\82Å
\96¼
\91O
\82Í
\8fI
\97¹
392 end else if p^ in kXMLWhite then
394 // Value
\82ª
\91¶
\8dÝ
\82µ
\82È
\82¢(
\8bK
\8ai
\8aO)
\82Ì
\82Å
\8e\9f\82Ì
\83m
\81[
\83h
\82Ö
397 found := AnsiStrTok( p, tail, kXMLAttributeNameStop );
398 SetLength( attributeName, found - p );
399 CopyMemory( PChar( attributeName ), p, found - p );
405 // Attribute
\82Ì
\92l
\82ð
\93Ç
\82Ý
\8d\9e\82Ý
406 p := AnsiStrNonTok( p, tail, kXMLWhite );
410 if XMLCloseCheck( p, tail, node, tag, isClosed ) then
414 if Length( attributeName ) > 0 then
415 //
\8bK
\8ai
\8aO
\82¾
\82¯
\82Ç
\82Ë
416 node.AddAttribute( attributeName, attributeValue );
418 //
\83^
\83O
\82ª
\95Â
\82¶
\82ç
\82ê
\82½
\82Ì
\82Å
\83\8a\83^
\81[
\83\93
419 //
\81¦NodeName
\82ð
\92Ê
\89ß
\82µ
\82Ä
\82é
\82Ì
\82Å
\93r
\92\86\82Å
\95Â
\82¶
\82Ä
\82é
\82±
\82Æ
\82É
\82È
\82é
\81B
420 //
\82æ
\82Á
\82Ä
\93Æ
\97§
\83m
\81[
\83h
\81B
424 //
\8e\9f\82Ì
\83m
\81[
\83h
\82Ö
426 end else if p^ = '"' then
428 //
\92l
\82ª ""
\82Å
\8a\87\82ç
\82ê
\82Ä
\82é
\82Ì
\82Å(
\82Ä
\82¢
\82¤
\82©
\8a\87\82ç
\82ê
\82Ä
\82È
\82«
\82á
\82¢
\82¯
\82È
\82¢
\82ñ
\82¾
\82¯
\82Ç)
429 //
\92l
\82ð
\88ê
\8a\87\93Ç
\82Ý
\8d\9e\82Ý
431 found := AnsiStrTok( p, tail, kXMLDQuote );
432 // attributeValue := Copy( p, 0, found - p ); //
\89½
\8cÌ
\82©
\8c\83\92x
433 SetLength( attributeValue, found - p );
434 CopyMemory( PChar( attributeValue ), p, found - p );
436 node.AddAttribute( attributeName, HtmlDecode( attributeValue ) );
438 //
\92l
\82ð
\93Ç
\82Ý
\8fI
\82í
\82Á
\82½
\82Ì
\82Å
\8fI
\97¹
439 p := found + 1; // '"'
\94ò
\82Î
\82µ
441 end else if p^ in kXMLWhite then
443 //
\8bK
\8ai
\8aO
\82¾
\82¯
\82Ç
\82Ë
444 node.AddAttribute( attributeName, HtmlDecode( attributeValue ) );
448 //
\8bK
\8ai
\8aO
\82¾
\82¯
\82Ç
\88ê
\89\9e\8eæ
\82Á
\82Ä
\82¨
\82
449 attributeValue := attributeValue + p^;
451 if p^ in kXMLKanji then
453 attributeValue := attributeValue + (p + 1)^;
460 end; // Attribute
\82Ì
\93Ç
\82Ý
\8d\9e\82Ý
463 end; // // node
\82Ì
\93Ç
\82Ý
\8d\9e\82Ý(1
\83\8b\81[
\83v
\82É
\82Â
\82« 1
\83m
\81[
\83h)
468 procedure LoadXMLDocument(
469 const fileName : string;
470 var doc : IXMLDocument
473 xmlMode = ( xmlHoge );
475 xmlFile : TMappedFile;
478 //Result := IXMLDocument.Create;
479 //doc := IXMLDocument.Create;
481 xmlFile := TMappedFile.Create( fileName );
485 XMLReadNode( p, p + xmlFile.Size, IXMLNode( doc ) );
486 //XMLReadNode( xmlFile, IXMLNode( Result ) );