Sign in Join
Wiki copytemporary

XML Tutorial/ja: what changed

Revision 1 to 2. Removed lines have a minus sign; added lines have a plus sign.

OldNewLine
11## 導入
22
33XML(=The Extensible Markup Language)は、[W3C](http://www.w3.org/) が推奨する、異なるシステム間で情報を交換するための言語です。情報はテキスト形式で保存しており、XHTMLのようなWebサービスでもよく使われる現代的なデータ交換方法は、XMLを基礎としています。
44
55Free Pascal Compiler の Free Component Library(FCL)には、XMLをサポートする "XMLRead"、"XMLWrite"、"DOM" といったユニットがあります。 FCL はすでに Lazarus のデフォルトの検索パスにはいっていますので、これらのユニットを uses に追加するだけで XML に関する機能を実装できるようになります。 FCL は現時点(October / 2005 訳注たぶん2008/12時点も同じ)で文書化されていませんので、このチュートリアルでは、これらのユニットを使った XML へのアクセス方法を紹介します。
66
77XML の Document Object Model(DOM) は、異なる言語やシステム間で XML を利用するために同じようなインターフェースを提供する、標準化されたオブジェクトの集合です。
88
99標準化は、メソッド、プロパティ、オブジェクトの他へのインターフェース部分についてのみ行われており、色々な言語のために、実装方法は自由になっています。 FCL では現在、完全に [DOM 1.0](http://www.w3.org/TR/1998/REC-DOM-Level-1-19981001/%7CXML) をサポートしています.
1010
1111(訳注注:日本語版 wiki で "XML" の項目が "ネットワーク" に書かれていたときの訳注をそのまま乗せています。訳注: XML , DOM を「完全に」パースする、という実装は、かなり大変なことです。また、異機種間での利用を目的に作られていることに注意しましょう。 Lazarus は、クロスコンパイル環境であり、これを標準で持っている事は、とても便利に快適にプログラムが出来ると思われます。日本語がどこまで検証されているのか、というところは、訳からはちょっと分かりませんが...。)
1212
1313## 利用例
1414
1515以下に、 XML データの利用例を記述しています。徐々に複雑な内容を説明していきます。
1616
1717### textノードを読み込む
1818
1919Delphi プログラマーの皆さん: TXMLDocument を用いるときには注意して下さい。ノード内のテキストは個々の TEXT ノードと扱われるため、個々のノードとしてノードのテキスト値を取得する必要があります。
2020
2121別の方法として、 **TextContent** プロパティを用いて、与えられた一つのノード以下の全てのテキストノードを一つにまとまって取得することもできます。
2222
2323**ReadXMLFile** プロシージャは、いつも新しい **TXMLDocument** を生成するため、あらかじめ **TXMLDocument** を生成する必要はありません。 しかし、不要になったときには、 **Free** をコールして document を確実に破棄して下さい。
2424
2525例えば、以下のxmlファイルについてアクセスする場合、
2626
2727注:全てのxmlサンプル類、サンプルコードは、UTF-8で保存する必要があるようです。また、以下の例では文頭に"半角スペース"を記入して、整形済みテキストとして表示しており、ほとんどのコードはそのまま動きますが、\<?xml\>\<sample\>は先頭の半角スペースを削除しないとうまく動きませんでした。 \<XML\> \<?xml version="1.0"?\>
2828
29-`<sample name="s1" >sampleXML`\
30-`  <group name="g1" >G1`\
31-`    <user>123</user>`\
32-`    <item val="int" >999</item>`\
33-`    <item val="str" >abc</item>`\
34-`  </group>`\
35-`  <group name="g2" >G2`\
36-`   <item val="str" >def</item>`\
37-`   </group>`\
38-`  <gr name="gr1" >GR1`\
39-`    <item val="str" >def</item>`\
40-`  </gr>`\
41-`</sample></XML>`
29+```text
30+<sample name="s1" >sampleXML
31+ <group name="g1" >G1
32+ <user>123</user>
33+ <item val="int" >999</item>
34+ <item val="str" >abc</item>
35+ </group>
36+ <group name="g2" >G2
37+ <item val="str" >def</item>
38+ </group>
39+ <gr name="gr1" >GR1
40+ <item val="str" >def</item>
41+ </gr>
42+</sample></XML>
43+```
4244
4345以下のコードで、テキストノードから値を取得する場合の、正しい方法と間違った方法をお見せします。
4446
4547注: 既存のコードがうまく動かなかったので(おそらく私のコンソールアプリの理解不足です)、全てのコードをGUIコードとして作り直しました。 (動作確認は、windowsXPSP2 上の lazarus0.9.26 で行いました。)
4648
4749はじめの設定
4850
49511.usesに XMLRead, Domを追加
5052
51532.form1にmemo1,button1,OpenDialogを追加
5254
5355``` pascal
5456 procedure TForm1.Button1Click(Sender: TObject);
5557 var
5658 tmpNode: TDOMNode;
5759 Doc: TXMLDocument;
5860 begin
5961 // Doc := TXMLDocument.Create;//ここで生成する必要はありません。
6062 Memo1.Lines.Clear;
6163
6264 // xml fileを読み込みます。
6365 Opendialog1.Execute;
6466 ReadXMLFile(Doc,Opendialog1.FileName);
6567 // "password" ノードを取得します。
6668 tmpNode := Doc.DocumentElement.FindNode('group');
6769
6870 // 選択したノードの値の書き出し
6971 Memo1.Lines.Add(tmpNode.NodeValue);// 空白値""しか取得できません。
7072 // (ノードのテキスト値は、実際は個々の小ノードになっています。)
7173 Memo1.Lines.Add(tmpNode.FirstChild.NodeValue);// "abc" が取得できます。
7274 // 他の方法
7375 Memo1.Lines.Add(tmpNode.TextContent);
7476 // 最後に、documentを破棄します。
7577 Doc.Free;
7678 end;
7779```
7880
7981出力は以下のようになります。
8082
8183
8284 G1
8385 G1 123999abc
8486
8587### ノードの名前を出力する
8688
8789ノードに順番にアクセスする場合、 **FirstChild** と **NextSibling** プロパティ(前方から繰り返し), または **LastChild** と **PreviousSibling** (後方から繰り返し)を用いればよいでしょう。
8890
8991ランダムアクセスには、**ChildNodes** または **GetElementsByTagName** メソッドが使えますが、これらは 最終的に破棄する必要のある TDOMNodeList オブジェクトを生成します。
9092
9193これは、他の DOM 実装(例えばMXSML) とは異なりますが、この理由は、FCL での実装がobject-basedであり、interface-based では無いためです。
9294
9395以下に、 form 上の TMemo にノードの名前を出力するサンプルを示します。 (訳注:元々の例は、上側の例と異なっているため(ファイル名がtestoなど)、記述を上記例に統一しました。)
9496
9597以下のxmlファイルにアクセスする場合、
9698
9799``` xml
98100 <?xml version="1.0"?>
99101 <sample name="s1" >sampleXML
100102 <group name="g1" >G1
101103 <user>123</user>
102104 <item val="int" >999</item>
103105 <item val="str" >abc</item>
104106 </group>
105107 <group name="g2" >G2
106108 <item val="str" >def</item>
107109 </group>
108110 <gr name="gr1" >GR1
109111 <item val="str" >def</item>
110112 </gr>
111113 </sample>
112114```
113115
114116はじめの設定
115117
1161181.usesに XMLRead, Dom を追加
117119
1181202.form1にmemo1,button1,OpenDialogを追加
119121
1201221a.**FirstChild** と **NextSibling** プロパティを使用(順番にアクセス) (訳注:英語版のコードは上記ノートと利用プロパティ、メソッドに整合性が無いため修正しました。)
121123
122124``` pascal
123125 procedure TForm1.Button1Click(Sender: TObject);
124126 var
125127 Child: TDOMNode;
126128 Doc: TXMLDocument;
127129 cnt: Integer;
128130 begin
129131 Memo1.Lines.Clear;
130132 Opendialog1.Execute;
131133 ReadXMLFile(Doc,Opendialog1.FileName);
132134
133135 // FirstChild プロパティの使用
134136 Child := Doc.DocumentElement.FirstChild;
135137 while Assigned(Child) do
136138 begin
137139 cnt:=cnt+1;
138140 Memo1.Lines.Add(inttostr(cnt)
139141 + ' ' + Child.NodeName + ' ' + Child.NodeValue);
140142 // NextSibling プロパティの使用
141143 Child := Child.NextSibling;
142144 end;
143145 Doc.Free;
144146 end;
145147```
146148
147149出力は以下のようになります。
148150
149151 1 #text sampleXML
150152 2 group
151153 3 group
152154 4 gr
153155
1541561b.**ChildNodes** と **getElementsByTagName** メソッドを使用(ランダムアクセス) 注)DOMNodeListのノード数はCountとなる。
155157
156158``` pascal
157159 procedure TForm1.Button1Click(Sender: TObject);
158160 var
159161 tmpNodes: TDOMNodeList;
160162 Doc: TXMLDocument;
161163 i: Integer;
162164 begin
163165 Memo1.Lines.Clear;
164166 Opendialog1.Execute;
165167 ReadXMLFile(Doc,Opendialog1.FileName);
166168
167169 // ChildNodes メソッドの使用
168170 tmpNodes:=Doc.DocumentElement.ChildNodes;
169171 Memo1.Lines.Add('1.ChildNodes count=' + inttostr(tmpNodes.Count));
170172 if(tmpNodes.Count <> 0) then
171173 for i:=0 to tmpNodes.Count-1 do begin
172174 Memo1.Lines.Add(inttostr(i)
173175 + ' ' + tmpNodes[i].NodeName
174176 + ' ' + tmpNodes[i].NodeValue);
175177 end;
176178 tmpNodes.Free;
177179
178180 // getElementsByTagName メソッドの使用
179181 tmpNodes:= Doc.GetElementsByTagName('group');
180182 Memo1.Lines.Add('2.getEBTN count=' + inttostr(tmpNodes.Count));
181183 if(tmpNodes.Count <> 0) then
182184 for i:=0 to tmpNodes.Count-1 do begin
183185 Memo1.Lines.Add(inttostr(i)
184186 + ' ' + tmpNodes[i].NodeName
185187 + ' ' + tmpNodes[i].NodeValue);
186188 end;
187189 tmpNodes.Free;
188190 end;
189191```
190192
191193出力は以下のようになります。
192194
193195 1.ChildNodes count=4
194196 0 #text sampleXML
195197 1 group
196198 2 group
197199 3 gr
198200 2.getEBTN count=2
199201 0 group
200202 1 group
201203
2022042.**ChildNodes** メソッドを用いた順次アクセスのコードは以下のようになります。 (注:日本語版の"ネットワーク"項目のXMLが記述されていたコードがあったので、とりあえず入れておきます。)
203205
204206``` pascal
205207 procedure TForm1.Button1Click(Sender: TObject);
206208 var
207209 Doc: TXMLDocument;
208210 i, j: Integer;
209211 begin
210212 Memo1.Lines.Clear;
211213 Opendialog1.Execute;
212214 ReadXMLFile(Doc,Opendialog1.FileName);
213215
214216 // ChildNodes メソッドの使用
215217 with Doc.DocumentElement.ChildNodes do
216218 begin
217219 for i := 0 to (Count - 1) do
218220 begin
219221 Memo1.Lines.Add('i' + inttostr(i)
220222 + Item[i].NodeName + ' ' + Item[i].NodeValue);
221223 for j := 0 to (Item[i].ChildNodes.Count - 1) do
222224 begin
223225 Memo1.Lines.Add(' j' + inttostr(j)
224226 + ' ' + Item[i].ChildNodes.Item[j].NodeName
225227 + ' ' + Item[i].ChildNodes.Item[j].NodeValue);
226228 end;
227229 end;
228230 end;
229231 Doc.Free;
230232 end;
231233```
232234
233235出力は以下のようになります。
234236
235237 i0#text sampleXML
236238 i1group
237239 j0 #text G1
238240 j1 user
239241 j2 item
240242 j3 item
241243 i2group
242244 j0 #text G2
243245 j1 item
244246 i3gr
245247 j0 #text GR1
246248 j1 item
247249
248250### XML を TreeView で表示する
249251
250252XMLファイルの一般的な利用として、XMLファイルの内容を TreeView の形で表示することがあります。 Lazarusの ”Common Controls” タブに TTreeView コンポーネントがあります。
251253
252254以下の手続きは、既にファイルから読み込んだか、コードの中で生成するかした XML 文書を取得し、その内容をTreeViewの形で表示します。それぞれのノードがもつキャプションが、最初の属性の内容になります。
253255
254256はじめの設定
255257
2562581.usesに XMLRead, Dom を追加
257259
2582602.form1にTTreeView1を追加
259261
2602623.TForm1のtypeにメソッド”procedure XML2Tree(tree: TTreeView; XMLDoc: TXMLDocument); ”を追加
261263
262264``` pascal
263265 procedure TForm1.XML2Tree(tree: TTreeView; XMLDoc: TXMLDocument);
264266 var
265267 iNode: TDOMNode;
266268
267269 procedure ProcessNode(Node: TDOMNode; TreeNode: TTreeNode);
268270 var
269271 cNode: TDOMNode;
270272 begin
271273 if Node = nil then Exit; // Stops if reached a leaf
272274
273275 // Adds a node to the tree
274276 TreeNode := tree.Items.AddChild(TreeNode,
275277 Node.Attributes[0].NodeValue);
276278
277279 // Goes to the child node
278280 cNode := Node.FirstChild;
279281
280282 // Processes all child nodes
281283 while cNode <> nil do
282284 begin
283285 ProcessNode(cNode, TreeNode);
284286 cNode := cNode.NextSibling;
285287 end;
286288 end;
287289
288290 begin
289291 iNode := XMLDoc.DocumentElement.FirstChild;
290292 while iNode <> nil do
291293 begin
292294 ProcessNode(iNode, nil); // Recursive
293295 iNode := iNode.NextSibling;
294296 end;
295297 end;
296298```
297299
298300### XML 書類を修正する
299301
300302まず、TDOMDocuments は DOM への*ハンドル*であることを覚えてください。このクラスのインスタンスは、インスタンスを作成 (create) してもXML文書をロードしても得ることができます。
301303
302304一方、ノードは通常のオブジェクトのようには生成することができません。必ず TDOMDocument クラスのメソッドを用いてください。その後、別のメソッドによって、新たに生成したノードをツリーの中の然るべき場所に置きます。これはノードというものがDOMの中の特定の文書によって「所有」される必要があるからです。
303305
304306以下に、TDOMDocumentのいくつかの普通のメソッドを示します。
305307
306308``` pascal
307309 function CreateElement(const tagName: DOMString): TDOMElement; virtual;
308310 function CreateTextNode(const data: DOMString): TDOMText;
309311 function CreateCDATASection(const data: DOMString): TDOMCDATASection;
310312 virtual;
311313 function CreateAttribute(const name: DOMString): TDOMAttr; virtual;
312314```
313315
314316次は、選択されたアイテムを TTreeView の中に置き、そのツリーが表す XML 文書の中に子ノードを挿入するメソッドの例です。[[Networking|XML2Tree function]] によってあらかじめ XML の全ての内容を TreeView に含めておく必要があります。
315317
316318``` pascal
317319 procedure TForm1.actAddChildNode(Sender: TObject);
318320var
319321 position: Integer;
320322 NovoNo: TDomNode;
321323begin
322324 // 選択された要素を発見する
323325 if TreeView1.Selected = nil then Exit;
324326
325327 if TreeView1.Selected.Level = 0 then
326328 begin
327329 position := TreeView1.Selected.Index;
328330
329331 NovoNo := XMLDoc.CreateElement('item');
330332 TDOMElement(NovoNo).SetAttribute('nome', 'Item');
331333 TDOMElement(NovoNo).SetAttribute('arquivo', 'Arquivo');
332334 with XMLDoc.DocumentElement.ChildNodes do
333335 begin
334336 Item[position].AppendChild(NovoNo);
335337 Free;
336338 end;
337339
338340 // TreeView を更新する
339341 TreeView1.Items.Clear;
340342 XML2Tree(TreeView1, XMLDoc);
341343 end
342344 else if TreeView1.Selected.Level >= 1 then
343345 begin
344346 {*******************************************************************
345347 * この手続きはツリーの最初のレベルでしかうまく働かないが、
346348 * ツリーの全ての深さに適用できるよう改造するのは容易である。
347349 *******************************************************************}
348350 end;
349351end;
350352```
351353
352354### TXMLDocument を一つの文字列から生成する
353355
354356MyXmlString がある XML ファイルの内容を含んだものだとすると、次のコードによって DOM を生成することができます。
355357
356358``` pascal
357359Var
358360 S : TStringStream;
359361 XML : TXMLDocument;
360362
361363begin
362364 S:= TStringStream.Create(MyXMLString);
363365 Try
364366 S.Position:=0;
365367 XML:=Nil;
366368 ReadXMLFile(XML,S); // Complete XML document
367369 // Alternatively:
368370 ReadXMLFragment(AParentNode,S); // Read only XML fragment.
369371 Finally
370372 S.Free;
371373 end;
372374end;
373375```
374376
375377### 文書の検証
376378
3773792007年3月以降、DTDの有効性を検証する機能が FCL XMLパーザに加わっています。文書の論理構造があらかじめ定義された *Document Type Definition* (DTD) と呼ばれる規則に則っている場合、有効です。
378380
379381次は DTD 付きの XML 文書の例です:
380382
381383``` xml
382384 <?xml version='1.0'?>
383385 <!DOCTYPE root [
384386 <!ELEMENT root (child)+ >
385387 <!ELEMENT child (#PCDATA)>
386388 ]>
387389 <root>
388390 <child>This is a first child.</child>
389391 <child>And this is the second one.</child>
390392 </root>
391393```
392394
393395この DTD はルートとなる要素が一つまたは複数の「子」ををち、それらの「子」は内部に文字データのみを持っていることを示しています。パーザが何か違反を発見した場合、レポートされます。
394396
395397この種の文書をロードするのは若干複雑になっています。TStream オブジェクトに XML データが含まれているとしましょう:
396398
397399``` pascal
398400procedure TMyObject.DOMFromStream(AStream: TStream);
399401var
400402 Parser: TDOMParser;
401403 Src: TXMLInputSource;
402404 TheDoc: TXMLDocument;
403405begin
404406 // パーザオブジェクトを生成する
405407 Parser := TDOMParser.Create;
406408 // 入力ソースオブジェクトも
407409 Src := TXMLInputSource.Create(AStream);
408410 // 検証しなくちゃ
409411 Parser.Options.Validate := True;
410412 // 報告を受け取るためのエラーハンドラを関連づける
411413 Parser.OnError := @ErrorHandler;
412414 // やっと仕事ができる
413415 Parser.Parse(Src, TheDoc);
414416 // ...後始末もできる。
415417 Src.Free;
416418 Parser.Free;
417419end;
418420
419421procedure TMyObject.ErrorHandler(E: EXMLReadError);
420422begin
421423 if E.Severity = esError then // 検査エラー以外関心がない
422424 writeln(E.Message);
423425end;
424426```
425427
426428### XML ファイルを生成する
427429
428430以下に、 XML ファイルを書き出すコードを示します。 (これは、DeveLazarus ブログのチュートリアルから転載しています)。 Uses 節に DOM と XMLWrite を追加することを忘れないでください。
429431
430432``` pascal
431433unit Unit1;
432434
433435{$mode objfpc}{$H+}
434436
435437interface
436438
437439uses
438440 Classes, SysUtils, LResources, Forms, Controls, Graphics, Dialogs, StdCtrls,
439441 DOM, XMLWrite;
440442
441443type
442444 { TForm1 }
443445 TForm1 = class(TForm)
444446 Button1: TButton;
445447 Label1: TLabel;
446448 Label2: TLabel;
447449 procedure Button1Click(Sender: TObject);
448450 private
449451 { private declarations }
450452 public
451453 { public declarations }
452454 end;
453455
454456var
455457 Form1: TForm1;
456458
457459implementation
458460
459461{ TForm1 }
460462
461463procedure TForm1.Button1Click(Sender: TObject);
462464var
463465 xdoc: TXMLDocument; // 文書を格納する変数
464466 RootNode, parentNode, nofilho: TDOMNode; // ノードを格納する変数
465467begin
466468 //文書を作成する
467469 xdoc := TXMLDocument.create;
468470
469471 //ルートノードを作成する
470472 RootNode := xdoc.CreateElement('register');
471473 Xdoc.Appendchild(RootNode); // ルートノードを保存する
472474
473475 //親ノードを作成する
474476 RootNode:= xdoc.DocumentElement;
475477 parentNode := xdoc.CreateElement('usuario');
476478 TDOMElement(parentNode).SetAttribute('id', '001'); // 親ノードを示す属性を作成する
477479 RootNode.Appendchild(parentNode); // 親ノードを保存する
478480
479481 //子ノードを作成する
480482 parentNode := xdoc.CreateElement('nome'); // 子ノードを一つ作成する
481483 //TDOMElement(parentNode).SetAttribute('sexo', 'M'); // 属性を作成する
482484 nofilho := xdoc.CreateTextNode('Fernando'); // ノードに値を挿入する
483485 parentNode.Appendchild(nofilho); // ノードを保存する
484486 RootNode.ChildNodes.Item[0].AppendChild(parentNode); // 子ノードをそれぞれの親ノードに挿入する
485487
486488 //子ノードを作成する
487489 parentNode := xdoc.CreateElement('idade'); // 子ノードを一つ作成する
488490 //TDOMElement(parentNode).SetAttribute('ano', '1976'); // 性を作成する
489491 nofilho := xdoc.CreateTextNode('32'); // ノードに値を挿入する
490492 parentNode.Appendchild(nofilho); // ノードを保存する
491493 .ChildNodes.Item[0].AppendChild(parentNode); // 子ノードをそれぞれの親ノードに挿入する
492494
493495 writeXMLFile(xDoc,'teste.xml'); // XML に書く
494496 Xdoc.free; // メモリを解放する
495497end;
496498
497499initialization
498500 {$I unit1.lrs}
499501
500502end.
501503```
502504
503505結果、書き出される XML ファイルは以下のようになります。:
504506
505507``` xml
506508<?xml version="1.0"?>
507509<register>
508510 <usuario id="001">
509511 <nome>Fernando</nome>
510512 <idade>32</idade>
511513 </usuario>
512514</register>
513515```
514516
515517また、以下にアイテムの番号による参照が不要な例を示します。
516518
517519``` pascal
518520procedure TForm1.Button2Click(Sender: TObject);
519521var
520522 Doc: TXMLDocument;
521523 RootNode, ElementNode,ItemNode,TextNode: TDOMNode;
522524 i: integer;
523525begin
524526 try
525527 // TXML ドキュメント を生成
526528 Doc := TXMLDocument.Create;
527529 // Create a root node
528530 RootNode := Doc.CreateElement('Root');
529531 Doc.Appendchild(RootNode);
530532 RootNode:= Doc.DocumentElement;
531533 // ノード を生成
532534 for i := 1 to 20 do
533535 begin
534536 ElementNode:=Doc.CreateElement('Element');
535537 TDOMElement(ElementNode).SetAttribute('id', IntToStr(i));
536538
537539 ItemNode:=Doc.CreateElement('Item1');
538540 TDOMElement(ItemNode).SetAttribute('Attr1', IntToStr(i));
539541 TDOMElement(ItemNode).SetAttribute('Attr2', IntToStr(i));
540542 TextNode:=Doc.CreateTextNode('Item1Value is '+IntToStr(i));
541543 ItemNode.AppendChild(TextNode);
542544 ElementNode.AppendChild(ItemNode);
543545
544546 ItemNode:=Doc.CreateElement('Item2');
545547 TDOMElement(ItemNode).SetAttribute('Attr1', IntToStr(i));
546548 TDOMElement(ItemNode).SetAttribute('Attr2', IntToStr(i));
547549 TextNode:=Doc.CreateTextNode('Item2Value is '+IntToStr(i));
548550 ItemNode.AppendChild(TextNode);
549551 ElementNode.AppendChild(ItemNode);
550552
551553 RootNode.AppendChild(ElementNode);
552554 end;
553555 // XML を保存
554556 WriteXMLFile(Doc,'TestXML_v2.xml');
555557 finally
556558 Doc.Free;
557559 end;
558560```
559561
560562生成される XML は以下のとおりです。:
561563
562564``` xml
563565<?xml version="1.0"?>
564566<Root>
565567 <Element id="1">
566568 <Item1 Attr1="1" Attr2="1">Item1Value is 1</Item1>
567569 <Item2 Attr1="1" Attr2="1">Item2Value is 1</Item2>
568570 </Element>
569571 <Element id="2">
570572 <Item1 Attr1="2" Attr2="2">Item1Value is 2</Item1>
571573 <Item2 Attr1="2" Attr2="2">Item2Value is 2</Item2>
572574 </Element>
573575 <Element id="3">
574576 <Item1 Attr1="3" Attr2="3">Item1Value is 3</Item1>
575577 <Item2 Attr1="3" Attr2="3">Item2Value is 3</Item2>
576578 </Element>
577579</Root>
578580```
579581
580582### エンコーディング
581583
582584FPC version 2.4 から、 XML reader is able to process data in any encoding by using external decoders. 詳細は [[XML Decoders/ja]] を見てください。
583585
584586XML の標準では、 XML の最初の行のエンコーディング属性は必須ではありません。いても置かなくてもかまいません。
585587
586588the encoding attribute in the first line of the XML is optional in case the actual encoding is UTF-8 (**without** BOM - Byte Order Marker) or UTF-16 (UTF-16 BOM).
587589
588590TXMLDocument has an encoding property since FPC 2.4. It is ignored as WriteXMLFile always uses UTF-8. TXMLDocument コンポーネントは、FPC 2.4 以降でエンコーディングを示すプロパティを持ちます。しかし、 常に UTF-8 を用いる writeXMLFile コンポーネントでは最初の行のエンコーディング属性は無視されます。
589591
590592- FPC 2.4 doesn´t generate an encoding attribute in the first line of the XML file
591593- FPC 2.6.0 and later explicitly write an UTF8 encoding attribute, as this is needed for some programs that cannot handle the XML without it.
592594
593595## 以下もご参照ください
594596
595597- [[XML Decoders|XML デコーダ]]
596598- [[Using INI Files|INI ファイルを使う]]
597599- [[fcl-xml]]
598600- [[Internet Tools]], for XPath 2 / XQuery processing
599601
600602## 外部リンク
601603
602604- [W3Schools](http://www.w3schools.com/xml/default.asp) XML のチュートリアル
603605- [Thomas Zastrow article](http://www.thomas-zastrow.de/texte/fpcxml/index.php) [Alternate link](http://web.archive.org/web/20080802150722/http://www.thomas-zastrow.de/texte/fpcxml/index.php) FPC と XML
604606
605607---
606608*From the Free Pascal wiki, page "XML Tutorial/ja", as it stood on 2020-03-02 after a change by Trev, out of the wiki's dump of 2024-05-26. Copyright stays with the author who wrote it, according to the old wiki's [[Licensing]] page. If you have concerns about this material, [message the admin](/wiki-contact).*

Back to history