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(
164 index := FAttributeCount;
165 Inc( FAttributeCount );
166 SetLength( FAttributes, FAttributeCount );
168 FAttributes[ index ].Name := Name;
169 FAttributes[ index ].Value := Value;
173 function IXMLDocument.GetDocumentElement() : IXMLNode;
176 Result := FChildNodes[ 0 ];
181 \brief tok
\82ð
\92T
\82·
182 \param p
\92T
\8dõ
\8aJ
\8en
\88Ê
\92u
183 \param tail
\8fI
\97¹
\88Ê
\92u + 1
184 \param tok
\92T
\82·
\83L
\83\83\83\89\83N
\83^
185 \return tok
\82ª
\8dÅ
\8f\89\82É
\8c©
\82Â
\82©
\82Á
\82½
\88Ê
\92u
190 const tok : TSysCharSet
199 end else if p^ in kXMLKanji then
210 \brief tok
\82Å
\82Í
\96³
\82¢
\83L
\83\83\83\89\83N
\83^
\82ð
\92T
\82·
211 \param p
\92T
\8dõ
\8aJ
\8en
\88Ê
\92u
212 \param tail
\8fI
\97¹
\88Ê
\92u + 1
213 \param tok
\92T
\82·
\83L
\83\83\83\89\83N
\83^
214 \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
216 function AnsiStrNonTok(
219 const tok : TSysCharSet
227 if p^ in kXMLKanji then
240 function XMLCloseCheck(
246 ) : boolean; // ch
\82ð
\82±
\82Ì
\83\8b\81[
\83`
\83\93\82ª
\8f\88\97\9d\82µ
\82½
\82È
\82ç true
258 //
\8aJ
\8en
\83^
\83O
\82Ì
\8dÅ
\8cã
\82Ü
\82Å
\93Ç
\82ñ
\82¾
259 Inc( p ); // '>'
\94ò
\82Î
\82µ
265 // <?xml?>
\82Ý
\82½
\82¢
\82È
\82â
\82Â
\81B
\82æ
\82Á
\82Ä
\96³
\8e\8b
266 p := AnsiStrTok( p, tail, kXMLTagEnd );
267 p := AnsiStrTok( p, tail, kXMLTagStart );
268 Inc( p ); // '<'
\94ò
\82Î
\82µ
269 p := AnsiStrNonTok( p, tail, kXMLWhite );
276 //
\83^
\83O
\96¼
\82ð
\93Ç
\82Ý
\8d\9e\82ñ
\82Å
\95Ô
\82·
277 Inc( p ); // '/'
\94ò
\82Î
\82µ
278 found := AnsiStrTok( p, tail, kXMLTagEnd );
279 // tag := Copy( p, 0, found - p ); //
\89½
\8cÌ
\82©
\8c\83\92x
280 SetLength( tag, found - p );
281 CopyMemory( PChar( tag ), p, found - p );
283 p := found + 1; // '>'
\94ò
\82Î
\82µ
291 function XMLReadNode(
295 ) : string; // node
\88È
\8aO
\82Ì
\83m
\81[
\83h
\82ª
\95Â
\82¶
\82ç
\82ê
\82½
\8fê
\8d\87\82Ì
\83m
\81[
\83h
\96¼
306 attributeName : string;
307 attributeValue : string;
314 // node
\82Ì
\93Ç
\82Ý
\8d\9e\82Ý(1
\83\8b\81[
\83v
\82É
\82Â
\82« 1
\83m
\81[
\83h)
315 node.ChildNodes := IXMLNode.Create;
319 // NodeName
\93Ç
\82Ý
\8d\9e\82Ý
320 p := AnsiStrNonTok( p, tail, kXMLWhite );
324 if XMLCloseCheck( p, tail, node, tag, isClosed ) then
333 end else if p^ = '<' then
335 //
\90V
\8bK
\83m
\81[
\83h
337 child := IXMLNode.Create;
338 tag := XMLReadNode( p, tail, child );
339 node.ChildNodes.Add( child );
341 //
\83^
\83O
\82ª
\95Â
\82¶
\82ç
\82ê
\82½
342 if Length( tag ) > 0 then
344 //
\8e©
\95ª
\82Ì
\82à
\82Ì
\82©
\83`
\83F
\83b
\83N
\82µ
\82Ä
\81A
\88á
\82¦
\82Î
\90e
\82É
\95Ô
\82·
345 if tag <> node.NodeName then
351 end else if p^ in kXMLWhite then
356 found := AnsiStrTok( p, tail, kXMLNodeNameStop );
357 SetLength( nodeName, found - p );
358 CopyMemory( PChar( nodeName ), p, found - p );
359 node.NodeName := nodeName;
365 // Attribute
\82Ì
\93Ç
\82Ý
\8d\9e\82Ý
368 // Attribute
\82Ì
\96¼
\91O
\82ð
\93Ç
\82Ý
\8d\9e\82Ý
370 attributeValue := '';
372 p := AnsiStrNonTok( p, tail, kXMLWhite );
376 if XMLCloseCheck( p, tail, node, tag, isClosed ) then
380 //
\83^
\83O
\82ª
\95Â
\82¶
\82ç
\82ê
\82½
\82Ì
\82Å
\83\8a\83^
\81[
\83\93
381 //
\81¦NodeName
\82ð
\92Ê
\89ß
\82µ
\82Ä
\82é
\82Ì
\82Å
\93r
\92\86\82Å
\95Â
\82¶
\82Ä
\82é
\82±
\82Æ
\82É
\82È
\82é
\81B
382 //
\82æ
\82Á
\82Ä
\93Æ
\97§
\83m
\81[
\83h
\81B
386 //
\8e\9f\82Ì
\83m
\81[
\83h
\82Ö
388 end else if p^ = '=' then
390 //
\82±
\82±
\82©
\82ç
\82Í
\92l
\82ª
\8en
\82Ü
\82é
\82Ì
\82Å
\96¼
\91O
\82Í
\8fI
\97¹
393 end else if p^ in kXMLWhite then
395 // Value
\82ª
\91¶
\8dÝ
\82µ
\82È
\82¢(
\8bK
\8ai
\8aO)
\82Ì
\82Å
\8e\9f\82Ì
\83m
\81[
\83h
\82Ö
398 found := AnsiStrTok( p, tail, kXMLAttributeNameStop );
399 SetLength( attributeName, found - p );
400 CopyMemory( PChar( attributeName ), p, found - p );
406 // Attribute
\82Ì
\92l
\82ð
\93Ç
\82Ý
\8d\9e\82Ý
407 p := AnsiStrNonTok( p, tail, kXMLWhite );
411 if XMLCloseCheck( p, tail, node, tag, isClosed ) then
415 if Length( attributeName ) > 0 then
416 //
\8bK
\8ai
\8aO
\82¾
\82¯
\82Ç
\82Ë
417 node.AddAttribute( attributeName, attributeValue );
419 //
\83^
\83O
\82ª
\95Â
\82¶
\82ç
\82ê
\82½
\82Ì
\82Å
\83\8a\83^
\81[
\83\93
420 //
\81¦NodeName
\82ð
\92Ê
\89ß
\82µ
\82Ä
\82é
\82Ì
\82Å
\93r
\92\86\82Å
\95Â
\82¶
\82Ä
\82é
\82±
\82Æ
\82É
\82È
\82é
\81B
421 //
\82æ
\82Á
\82Ä
\93Æ
\97§
\83m
\81[
\83h
\81B
425 //
\8e\9f\82Ì
\83m
\81[
\83h
\82Ö
427 end else if p^ = '"' then
429 //
\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Ç)
430 //
\92l
\82ð
\88ê
\8a\87\93Ç
\82Ý
\8d\9e\82Ý
432 found := AnsiStrTok( p, tail, kXMLDQuote );
433 // attributeValue := Copy( p, 0, found - p ); //
\89½
\8cÌ
\82©
\8c\83\92x
434 SetLength( attributeValue, found - p );
435 CopyMemory( PChar( attributeValue ), p, found - p );
437 node.AddAttribute( attributeName, HtmlDecode( attributeValue ) );
439 //
\92l
\82ð
\93Ç
\82Ý
\8fI
\82í
\82Á
\82½
\82Ì
\82Å
\8fI
\97¹
440 p := found + 1; // '"'
\94ò
\82Î
\82µ
442 end else if p^ in kXMLWhite then
444 //
\8bK
\8ai
\8aO
\82¾
\82¯
\82Ç
\82Ë
445 node.AddAttribute( attributeName, HtmlDecode( attributeValue ) );
449 //
\8bK
\8ai
\8aO
\82¾
\82¯
\82Ç
\88ê
\89\9e\8eæ
\82Á
\82Ä
\82¨
\82
450 attributeValue := attributeValue + p^;
452 if p^ in kXMLKanji then
454 attributeValue := attributeValue + (p + 1)^;
461 end; // Attribute
\82Ì
\93Ç
\82Ý
\8d\9e\82Ý
464 end; // // node
\82Ì
\93Ç
\82Ý
\8d\9e\82Ý(1
\83\8b\81[
\83v
\82É
\82Â
\82« 1
\83m
\81[
\83h)
469 procedure LoadXMLDocument(
470 const fileName : string;
471 var doc : IXMLDocument
474 xmlMode = ( xmlHoge );
476 xmlFile : TMappedFile;
479 //Result := IXMLDocument.Create;
480 //doc := IXMLDocument.Create;
482 xmlFile := TMappedFile.Create( fileName );
486 XMLReadNode( p, p + xmlFile.Size, IXMLNode( doc ) );
487 //XMLReadNode( xmlFile, IXMLNode( Result ) );