RAD Studio XE4(Delphi) で XML データを作成する方法(Mac OS X 対応版)

RAD Studio XE4(Delphi) を用いてゼロから XML データを作成する方法についてのメモ。
昨日の記事と違い、この記事の方法で作ったプログラムは、Mac OS X 上でも動作します。

↓最終的にできる XML ファイルはこんなヤツです(Chrome で開いたところ)。
Delphi XML Mac OS X Chrome

↓一応アプリを Mac OS X で実行したところも。
Delphi XML App Mac OS X

手順

  1. Form 上に TXMLDocument コンポーネントを配置
  2. TXMLDocument.DOMVendor を ADOM XML v4 に設定
  3. Xml.Win.msxmldom が unit に含まれていたら削除
  4. ボタンなどのイベントハンドラに次のコードを記述し、実行♪
    [code lang=’delphi’] procedure TForm1.Button1Click(Sender: TObject);
    var
    RootNode, ChildNode: IXMLNode;
    begin
    //XMLDocument1.Encoding := ‘UTF-8’;
    RootNode := XMLDocument1.AddChild(‘root’);
    ChildNode := RootNode.AddChild(‘childnode’);
    ChildNode.Text := ‘childnode.text’;
    ChildNode.Attributes[‘attr1’] := ‘attrribute.text’;
    //XMLDocument1.XML[0] := ‘< ?xml version="1.0" encoding="UTF-8"?>‘;
    Memo1.Lines := XMLDocument1.XML;
    end;

    procedure TForm2.Button2Click(Sender: TObject);
    begin
    caption := ExtractFilePath(ParamStr(0)) + ‘test.xml’;
    XMLDocument1.SaveToFile(ExtractFilePath(ParamStr(0)) + ‘test.xml’);
    end;
    [/code]

このプログラムでのポイントは2点。

1点目は、TXMLDocument.DOMVendor を ADOM XML v4 に設定すること。
MSXML は Windows でしか利用できないからです。

2点目は、XML のエンコードです。
DOMVendor に ADOM XML v4 を指定した TXMLDocument は、ノードの追加・削除などの操作を行うと、なぜか Encoding が UTF-16LE となる仕様の様です。
ですので、データ作成の最後に XMLDocument1.XML[0] := ‘< ?xml version="1.0" encoding="UTF-8"?>‘; と XML ヘッダーを変更しています。
XMLDocument1.Encoding := ‘UTF-8’; をコメントアウトで残しているのは、どこで指定しても無意味だったことへの注意のためです。

XMLDocument1.SaveToFile() メソッドを使用すれば、きちんと XML ヘッダーが UTF-8 で保存されました。

なお、ExtractFilePath(ParamStr(0)) すると .app ファイルの中に保存されることになるので、Finder のコンテクスト メニューから「パッケージの内容を表示」を選択して XML ファイルを確認する必要があります。

参考:
Createing XML files with Delphi and FireMonkey on Mac
WSDL XML rendered by ‘ADOM XML v4’ in Delphi XE2

え?Webサイトのバックアップ、してないの!?

いざという時には復旧までしてくれる
『ワードプレス外部バックアップサービス』

■3つの特長
・自分でやらなくて良い
・いざという時の復旧付き
・外部サーバーにバックアップ

RAD Studio XE4(Delphi) で XML データを作成する方法(Mac OS X 対応版)” に対して1件のコメントがあります。

  1. 高橋智宏 より:

    QuaityCentralの
    http://qc.embarcadero.com/wc/qcmain.aspx?d=80008
    と同じだと思います。
    以下のコードを参考にしてみしてください。

    procedure TForm1.Button1Click(Sender: TObject);
    var
    RootNode, ChildNode: IXMLNode;
    begin
    XMLDocument1.Active := True;
    XMLDocument1.Version := ‘1.0’;
    XMLDocument1.Encoding := ‘UTF-8’;
    RootNode := XMLDocument1.AddChild(‘root’);
    ChildNode := RootNode.AddChild(‘childnode’);
    ChildNode.Text := ‘childnodeてきすと’;
    ChildNode.Attributes[‘attr1’] := ‘attrribute.text’;
    end;

    procedure TForm1.Button2Click(Sender: TObject);
    begin
    // UnicodeString(UTF-16)型として取り出すが、encoding値をUTF-8にする場合
    Memo1.Text := StringReplace(XMLDocument1.XML.Text,
    ”,
    ”,
    [rfReplaceAll]);

    // UTF-8のXMLファイルとして保存する場合
    // が自動で追加される
    XMLDocument1.SaveToFile(ExtractFilePath(ParamStr(0)) + ‘test.xml’);
    end;

  2. 高橋智宏 より:

    あ、StringReplaceの第2と第3のパラメータが、投稿時に消されてしまいましたね。
    http://qc.embarcadero.com/wc/qcmain.aspx?d=80008
    のコードを参考にして、UTF-16LEからUTF-8に置き換えてください。

  3. 高橋智宏 より:

    あと、
    // が自動で追加される
    の部分も消されましたね。
    encoding=’UTF-8’のXML ヘッダーが自動で追加されます。

  4. Kryu^2 より:

    >高橋さん
    コメントありがとうございます。

    記事を修正しました。

コメントを残す