4 XMLIntf, XMLDoc
\82 \82½
\82è
\82Ì
\83N
\83\8d\81[
\83\93
9 //==================================================
11 //==================================================
13 Classes, SysUtils, Windows,
16 //==================================================
18 //==================================================
20 //
\82í
\82¯
\82í
\82©
\82ç
\82¸
\8dì
\82Á
\82Ä
\82é
\82©
\82ç
\83o
\83O
\82¾
\82ç
\82¯
\82©
\82à
21 XMLDictionary = Record
31 FAttributeCount : Integer;
32 FChildNodes : IXMLNode;
33 FNodes : array of IXMLNode;
34 FAttributes : array of XMLDictionary;
35 function GetAttribute( const Name : string ) : string;
36 function GetNode( Index : Integer ) : IXMLNode;
39 destructor Destroy; override;
41 property NodeName : string read FNodeName write FNodeName;
42 property Attributes[ const Name : string ] : string read GetAttribute;
43 property Node[ Index : Integer ] : IXMLNode read GetNode; default;
44 property ChildNodes : IXMLNode read FChildNodes write FChildNodes;
45 property Count : Integer read FCount write FCount;
46 procedure Add( node : IXMLNode );
47 procedure AddAttribute( const Name : string; const Value : string );
50 IXMLDocument = class( IXMLNode )
52 function GetDocumentElement() : IXMLNode;
54 property DocumentElement : IXMLNode read GetDocumentElement;
57 function XMLCloseCheck(
62 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
63 ) : boolean; // ch
\82ð
\82±
\82Ì
\83\8b\81[
\83`
\83\93\82ª
\8f\88\97\9d\82µ
\82½
\82È
\82ç true
69 ) : string; // node
\88È
\8aO
\82Ì
\83m
\81[
\83h
\82ª
\95Â
\82¶
\82ç
\82ê
\82½
\8fê
\8d\87\82Ì
\83m
\81[
\83h
\96¼
71 procedure LoadXMLDocument(
72 const fileName : string;
73 var doc : IXMLDocument
76 //==================================================
78 //==================================================
79 kXMLWhite : TSysCharSet = [#0..#$20];
80 kXMLNodeNameStop : TSysCharSet = [#0..#$20, '/', '>'];
81 kXMLAttributeNameStop : TSysCharSet = [#0..#$20, '=', '/', '>'];
82 kXMLDQuote : TSysCharSet = ['"'];
83 kXMLTagStart : TSysCharSet = ['<'];
84 kXMLTagEnd : TSysCharSet = ['>'];
85 kXMLKanji : TSysCharSet = [#$81..#$9f, #$E0..#$fc];
87 //==================================================
89 //==================================================
92 constructor IXMLNode.Create;
103 destructor IXMLNode.Destroy;
108 for i := FCount - 1 downto 0 do
116 function IXMLNode.GetAttribute( const Name : string ) : string;
122 while i < FAttributeCount do
124 if Name = FAttributes[ i ].Name then
126 Result := FAttributes[ i ].Value;
135 function IXMLNode.GetNode( Index : Integer ) : IXMLNode;
138 Result := FNodes[ Index ];
142 procedure IXMLNode.Add( node : IXMLNode );
146 if FCount > FCapacity then begin
147 FCapacity := FCapacity + (FCapacity shr 2) + 1;
148 SetLength( FNodes, FCapacity );
151 FNodes[ FCount - 1 ] := node;
155 procedure IXMLNode.AddAttribute(
163 index := FAttributeCount;
164 Inc( FAttributeCount );
165 SetLength( FAttributes, FAttributeCount );
167 FAttributes[ index ].Name := Name;
168 FAttributes[ index ].Value := Value;
172 function IXMLDocument.GetDocumentElement() : IXMLNode;
175 Result := FChildNodes[ 0 ];
180 \brief tok
\82ð
\92T
\82·
181 \param p
\92T
\8dõ
\8aJ
\8en
\88Ê
\92u
182 \param tail
\8fI
\97¹
\88Ê
\92u + 1
183 \param tok
\92T
\82·
\83L
\83\83\83\89\83N
\83^
184 \return tok
\82ª
\8dÅ
\8f\89\82É
\8c©
\82Â
\82©
\82Á
\82½
\88Ê
\92u
189 const tok : TSysCharSet
198 end else if p^ in kXMLKanji then
209 \brief tok
\82Å
\82Í
\96³
\82¢
\83L
\83\83\83\89\83N
\83^
\82ð
\92T
\82·
210 \param p
\92T
\8dõ
\8aJ
\8en
\88Ê
\92u
211 \param tail
\8fI
\97¹
\88Ê
\92u + 1
212 \param tok
\92T
\82·
\83L
\83\83\83\89\83N
\83^
213 \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
215 function AnsiStrNonTok(
218 const tok : TSysCharSet
226 if p^ in kXMLKanji then
239 function XMLCloseCheck(
245 ) : boolean; // ch
\82ð
\82±
\82Ì
\83\8b\81[
\83`
\83\93\82ª
\8f\88\97\9d\82µ
\82½
\82È
\82ç true
257 //
\8aJ
\8en
\83^
\83O
\82Ì
\8dÅ
\8cã
\82Ü
\82Å
\93Ç
\82ñ
\82¾
258 Inc( p ); // '>'
\94ò
\82Î
\82µ
264 // <?xml?>
\82Ý
\82½
\82¢
\82È
\82â
\82Â
\81B
\82æ
\82Á
\82Ä
\96³
\8e\8b
265 p := AnsiStrTok( p, tail, kXMLTagEnd );
266 p := AnsiStrTok( p, tail, kXMLTagStart );
267 Inc( p ); // '<'
\94ò
\82Î
\82µ
268 p := AnsiStrNonTok( p, tail, kXMLWhite );
275 //
\83^
\83O
\96¼
\82ð
\93Ç
\82Ý
\8d\9e\82ñ
\82Å
\95Ô
\82·
276 Inc( p ); // '/'
\94ò
\82Î
\82µ
277 found := AnsiStrTok( p, tail, kXMLTagEnd );
278 // tag := Copy( p, 0, found - p ); //
\89½
\8cÌ
\82©
\8c\83\92x
279 SetLength( tag, found - p );
280 CopyMemory( PChar( tag ), p, found - p );
282 p := found + 1; // '>'
\94ò
\82Î
\82µ
290 function XMLReadNode(
294 ) : string; // node
\88È
\8aO
\82Ì
\83m
\81[
\83h
\82ª
\95Â
\82¶
\82ç
\82ê
\82½
\8fê
\8d\87\82Ì
\83m
\81[
\83h
\96¼
304 attributeName : string;
305 attributeValue : string;
310 // node
\82Ì
\93Ç
\82Ý
\8d\9e\82Ý(1
\83\8b\81[
\83v
\82É
\82Â
\82« 1
\83m
\81[
\83h)
311 node.ChildNodes := IXMLNode.Create;
315 // NodeName
\93Ç
\82Ý
\8d\9e\82Ý
316 p := AnsiStrNonTok( p, tail, kXMLWhite );
320 if XMLCloseCheck( p, tail, node, tag, isClosed ) then
329 end else if p^ = '<' then
331 //
\90V
\8bK
\83m
\81[
\83h
333 child := IXMLNode.Create;
334 tag := XMLReadNode( p, tail, child );
335 node.ChildNodes.Add( child );
337 //
\83^
\83O
\82ª
\95Â
\82¶
\82ç
\82ê
\82½
338 if Length( tag ) > 0 then
340 //
\8e©
\95ª
\82Ì
\82à
\82Ì
\82©
\83`
\83F
\83b
\83N
\82µ
\82Ä
\81A
\88á
\82¦
\82Î
\90e
\82É
\95Ô
\82·
341 if tag <> node.NodeName then
347 end else if p^ in kXMLWhite then
352 found := AnsiStrTok( p, tail, kXMLNodeNameStop );
353 SetLength( nodeName, found - p );
354 CopyMemory( PChar( nodeName ), p, found - p );
355 node.NodeName := nodeName;
361 // Attribute
\82Ì
\93Ç
\82Ý
\8d\9e\82Ý
364 // Attribute
\82Ì
\96¼
\91O
\82ð
\93Ç
\82Ý
\8d\9e\82Ý
366 attributeValue := '';
368 p := AnsiStrNonTok( p, tail, kXMLWhite );
372 if XMLCloseCheck( p, tail, node, tag, isClosed ) then
376 //
\83^
\83O
\82ª
\95Â
\82¶
\82ç
\82ê
\82½
\82Ì
\82Å
\83\8a\83^
\81[
\83\93
377 //
\81¦NodeName
\82ð
\92Ê
\89ß
\82µ
\82Ä
\82é
\82Ì
\82Å
\93r
\92\86\82Å
\95Â
\82¶
\82Ä
\82é
\82±
\82Æ
\82É
\82È
\82é
\81B
378 //
\82æ
\82Á
\82Ä
\93Æ
\97§
\83m
\81[
\83h
\81B
382 //
\8e\9f\82Ì
\83m
\81[
\83h
\82Ö
384 end else if p^ = '=' then
386 //
\82±
\82±
\82©
\82ç
\82Í
\92l
\82ª
\8en
\82Ü
\82é
\82Ì
\82Å
\96¼
\91O
\82Í
\8fI
\97¹
389 end else if p^ in kXMLWhite then
391 // Value
\82ª
\91¶
\8dÝ
\82µ
\82È
\82¢(
\8bK
\8ai
\8aO)
\82Ì
\82Å
\8e\9f\82Ì
\83m
\81[
\83h
\82Ö
394 found := AnsiStrTok( p, tail, kXMLAttributeNameStop );
395 SetLength( attributeName, found - p );
396 CopyMemory( PChar( attributeName ), p, found - p );
402 // Attribute
\82Ì
\92l
\82ð
\93Ç
\82Ý
\8d\9e\82Ý
403 p := AnsiStrNonTok( p, tail, kXMLWhite );
407 if XMLCloseCheck( p, tail, node, tag, isClosed ) then
411 if Length( attributeName ) > 0 then
412 //
\8bK
\8ai
\8aO
\82¾
\82¯
\82Ç
\82Ë
413 node.AddAttribute( attributeName, attributeValue );
415 //
\83^
\83O
\82ª
\95Â
\82¶
\82ç
\82ê
\82½
\82Ì
\82Å
\83\8a\83^
\81[
\83\93
416 //
\81¦NodeName
\82ð
\92Ê
\89ß
\82µ
\82Ä
\82é
\82Ì
\82Å
\93r
\92\86\82Å
\95Â
\82¶
\82Ä
\82é
\82±
\82Æ
\82É
\82È
\82é
\81B
417 //
\82æ
\82Á
\82Ä
\93Æ
\97§
\83m
\81[
\83h
\81B
421 //
\8e\9f\82Ì
\83m
\81[
\83h
\82Ö
423 end else if p^ = '"' then
425 //
\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Ç)
426 //
\92l
\82ð
\88ê
\8a\87\93Ç
\82Ý
\8d\9e\82Ý
428 found := AnsiStrTok( p, tail, kXMLDQuote );
429 // attributeValue := Copy( p, 0, found - p ); //
\89½
\8cÌ
\82©
\8c\83\92x
430 SetLength( attributeValue, found - p );
431 CopyMemory( PChar( attributeValue ), p, found - p );
433 node.AddAttribute( attributeName, HtmlDecode( attributeValue ) );
435 //
\92l
\82ð
\93Ç
\82Ý
\8fI
\82í
\82Á
\82½
\82Ì
\82Å
\8fI
\97¹
436 p := found + 1; // '"'
\94ò
\82Î
\82µ
438 end else if p^ in kXMLWhite then
440 //
\8bK
\8ai
\8aO
\82¾
\82¯
\82Ç
\82Ë
441 node.AddAttribute( attributeName, HtmlDecode( attributeValue ) );
445 //
\8bK
\8ai
\8aO
\82¾
\82¯
\82Ç
\88ê
\89\9e\8eæ
\82Á
\82Ä
\82¨
\82
446 attributeValue := attributeValue + p^;
448 if p^ in kXMLKanji then
450 attributeValue := attributeValue + (p + 1)^;
457 end; // Attribute
\82Ì
\93Ç
\82Ý
\8d\9e\82Ý
460 end; // // node
\82Ì
\93Ç
\82Ý
\8d\9e\82Ý(1
\83\8b\81[
\83v
\82É
\82Â
\82« 1
\83m
\81[
\83h)
465 procedure LoadXMLDocument(
466 const fileName : string;
467 var doc : IXMLDocument
470 xmlMode = ( xmlHoge );
472 xmlFile : TMappedFile;
475 //Result := IXMLDocument.Create;
476 //doc := IXMLDocument.Create;
478 xmlFile := TMappedFile.Create( fileName );
482 XMLReadNode( p, p + xmlFile.Size, IXMLNode( doc ) );
483 //XMLReadNode( xmlFile, IXMLNode( Result ) );