std.xml
XMLの作成や読み込みを行うクラスと関数このモジュールの基本的な構成は、 XML文書を一から構築するスタンドアロンの関数とクラス (Tag, Element, Document)と、既存のXMLファイルを読み込む機能 (ElementParser, DocumentParser)とからなっています。読み込みクラスを使ってXML文書を一から 構築することも可能かもしれませんが、それは意図した用途ではありません。DocumentParser と ElementParser の処理は自由にカスタマイズ可能で、 十分にやりたいことを実現できます。 Source:
std/xml.d License:
Boost License 1.0. Authors:
Janice Caron Examples:
この例では、XMLファイルから DOM (Document Object Model) ツリーを作成します。
import std.xml; import std.stdio; import std.string; // books.xml は Microsoft XML Core Services (MSXML) SDK で // 様々な例に用いられているものです。 // // http://msdn2.microsoft.com/en-us/library/ms762271(VS.85).aspx を参照して下さい。 void main() { string s = cast(string)std.file.read("books.xml"); // well-formedness をチェック check(s); // DOMツリーの作成 auto doc = new Document(s); // そのまま表示 writefln(doc); }
Example:
次の例もほぼ同じことを行いますが、手動でファイル内容の解体と再構築を行います。 処理の内容は増えますが、 このテクニックはより強力な表現力を持っています。
import std.xml; import std.stdio; import std.string; struct Book { string id; string author; string title; string genre; string price; string pubDate; string description; } void main() { string s = cast(string)std.file.read("books.xml"); // well-formedness をチェック check(s); // 要素の分解 Book[] books; auto xml = new DocumentParser(s); xml.onStartTag["book"] = (ElementParser xml) { Book book; book.id = xml.tag.attr["id"]; xml.onEndTag["author"] = (in Element e) { book.author = e.text; }; xml.onEndTag["title"] = (in Element e) { book.title = e.text; }; xml.onEndTag["genre"] = (in Element e) { book.genre = e.text; }; xml.onEndTag["price"] = (in Element e) { book.price = e.text; }; xml.onEndTag["publish-date"] = (in Element e) { book.pubDate = e.text; }; xml.onEndTag["description"] = (in Element e) { book.description = e.text; }; xml.parse(); books ~= book; }; xml.parse(); // 再び一つにまとめる auto doc = new Document(new Tag("catalog")); foreach(book;books) { auto element = new Element("book"); element.tag.attr["id"] = book.id; element ~= new Element("author", book.author); element ~= new Element("title", book.title); element ~= new Element("genre", book.genre); element ~= new Element("price", book.price); element ~= new Element("publish-date",book.pubDate); element ~= new Element("description", book.description); doc ~= element; } // Pretty-print writefln(join(doc.pretty(3),"\n")); }
- 文字がXML標準に従った文字であればtrueを返します
Standards:
XML 1.0
Params:
dchar c テスト対象の文字
- XML標準に従って、文字がホワイトスペース文字かどうか判定します。
以下の文字のみが、XMLではホワイトスペースとして扱われます - スペース、タブ、CR、LF
Standards:
XML 1.0
Params:
dchar c テスト対象の文字
- XML標準に従って、文字が数字かどうか判定します。
Standards:
XML 1.0
Params:
dchar c テスト対象の文字
- XML標準に従って、文字が 'letter' かどうか判定します。
Standards:
XML 1.0
Params:
dchar c テスト対象の文字
- XML標準に従って、
文字が 'ideographic character' かどうか判定します。
Standards:
XML 1.0
Params:
dchar c テスト対象の文字
- XML標準に従って、
文字が 'base character' かどうか判定します。
Standards:
XML 1.0
Params:
dchar c テスト対象の文字
- XML標準に従って、
文字が 'combining character' かどうか判定します。
Standards:
XML 1.0
Params:
dchar c テスト対象の文字
- XML標準に従って、文字が 'extender' かどうか判定します。
Standards:
XML 1.0
Params:
dchar c テスト対象の文字
- エスケープの必要のある全ての文字を定義済みのXMLエンティティで置き換えた
結果の文字列を返します。
encode() はいくつかの文字 (ampersand, quote, apostrophe, less-than, greater-than) をエスケープし、 decode() はこれらを元に戻します。std.xml のクラスを使っている限りでは、 直接これらの関数を呼ぶ必要はありません。 全てのエンコード・デコード処理は自動的に行われます。
文字列に変更の必要がなかった場合は、引数をそのまま返します。
Standards:
XML 1.0
Parameters:s エンコード対象の文字列
Returns:
エンコード済み文字列
Examples:
writefln(encode("a > b")); // "a > b" を出力
- decodeのモード
- NONE
- LOOSE
- STRICT
- 定義済みXMLエンティティを全て展開した文字列を返します。
encode() はいくつかの文字 (ampersand, quote, apostrophe, less-than, greater-than) をエスケープし、 decode() はこれらを元に戻します。std.xml のクラスを使っている限りでは、 直接これらの関数を呼ぶ必要はありません。 全てのエンコード・デコード処理は自動的に行われます。
この関数がデコードする対象は、 &, ", ', < and >, そして、€ のような16進や10進のエンティティです。
文字列がアンパサンドを含んでいない場合、引数をそのまま返します。
"mode" パラメタには DecodeMode.NONE (デコードしない)、 DecodeMode.LOOSE (デコードする、エラーは無視)、 DecodeMode.STRICT (デコードする、エラー時にはDecodeException例外)、のいずれかを指定できます。
Standards:
XML 1.0
Params:
string s デコード対象の文字列 DecodeMode mode (optional) デコードのモード (デフォルトは LOOSE)
Throws:
mode == DecodeMode.STRICT でデコード失敗した場合、DecodeException
Returns:
デコード済み文字列
Examples:
writefln(decode("a > b")); // "a > b" を出力
- XML文書を表すクラス
Standards:
XML 1.0
- ルート要素より前に出現する全てのテキストです。
デフォルトは <?xml version="1.0"?> です。
- ルート要素より後ろに出現する全てのテキストです。
デフォルトは空文字列です。
- this(string s);
- XMLテキストをparseしてDocumentを構築します。
この関数は完全な DOM (Document Object Model) ツリーを作ります。
この関数への入力は必ず valid な XML でなければなりません。 これは、DocumentParser の事前条件で強制されます。
Params:
string s 完全なXMLテキスト
- this(const(Tag) tag);
- TagからDocumentを構築します。
Params:
const(Tag) tag 文書の開始タグ
- 二つの Document の等値性を比較します。
Examples:
Document d1,d2; if (d1 == d2) { }
- 二つの Document の順序比較を行います。
この関数を呼び出すことは非常にまれでしょう。これは、Document を連想配列のキーとして使うことを想定して実装されています。
Examples:
Document d1,d2; if (d1 < d2) { }
- Document のハッシュ値を返します。
この関数を呼び出すことは非常にまれでしょう。これは、Document を連想配列のキーとして使うことを想定して実装されています。
- Document の文字列表現を返します。
(つまり、文書の完全なXMLです)
- XML要素を表現するクラス
Standards:
XML 1.0
- 要素の開始タグ
- 要素の子項目
- 要素のテキスト項目
- 要素のCData項目
- 要素のコメント
- 要素の processing instruction
- 要素の子要素
- this(string name, string interior = null);
- 指定された名前と中身のテキストから
Element を構築
Params:
string name 要素名 string interior (optional) テキストの中身
Examples:
auto element = new Element("title","Serenity") // constructs the element <title>Serenity</title>
- this(const(Tag) tag_);
- Tag から Element を構築
Params:
const(Tag) tag 要素の開始タグまたは空タグ
- テキスト item をこの要素の内容として末尾に追加
Params:
Text item 追加したい項目
Examples:
Element element; element ~= new Text("hello");
- CData item をこの要素の内容として末尾に追加
Params:
CData item 追加したい項目
Examples:
Element element; element ~= new CData("hello");
- コメントをこの要素の内容として末尾に追加
Params:
Comment item 追加したい項目
Examples:
Element element; element ~= new Comment("hello");
- Processing Instruction をこの要素の内容として末尾に追加
Params:
ProcessingInstruction item 追加したい項目
Examples:
Element element; element ~= new ProcessingInstruction("hello");
- 要素 item をこの要素の内容として末尾に追加
Params:
Element item 追加したい項目
Examples:
Element element; Element other = new Element("br"); element ~= other; // <br /> を表す要素を追加
- 二つの Element の等値性を比較
Examples:
Element e1,e2; if (e1 == e2) { }
- 二つの Element の比較
この関数を呼び出すことは非常にまれでしょう。これは、Element を連想配列のキーとして使うことを想定して実装されています。
Examples:
Element e1,e2; if (e1 < e2) { }
- Element のハッシュ値を計算
この関数を呼び出すことは非常にまれでしょう。これは、Element を連想配列のキーとして使うことを想定して実装されています。
- 要素のデコードされた中身を返します。
要素はテキストのみを格納していると仮定します。 従って、例えば、 "<title>Good & Bad</title>" に対しては "Good & Bad" を返します。
Params:
DecodeMode mode (optional) デコードのモード (デフォルトは LOOSE).
Throws:
デコード失敗したら DecodeException
- この項目のインデントされた文字列表現を返します。
Params:
uint indent (optional) この要素をインデントするスペースの数。 デフォルトは 2。
- Element の文字列表現を返します。
Examples:
auto element = new Element("br"); writefln(element.toString); // 出力は "<br />"
- タグの種類
- START
- END
- EMPTY
- XMLのタグを表すクラス
Standards:
XML 1.0
クラス不変条件によって以下を保証します。- type がvalidな enum TagType の値であること
- name がvalidな文字のみで構成されていること
- 属性名それぞれがvalidな文字のみで構成されていること
- タグの種類
- タグ名
- 属性の連想配列
- this(string name, TagType type = (TagType).START);
- 指定された名前と種類で Tag のインスタンスを構築します。
コンストラクタは属性を初期化しません。属性を初期化するには、 attr メンバ変数を操作します。
Params:
string name タグ名 TagType type (optional) タグの種類。 省略時のデフォルトは TagType.START です。
Examples:
auto tag = new Tag("img",Tag.EMPTY); tag.attr["src"] = "http://example.com/example.jpg";
- 二つの Tag の等値性を比較
この関数を呼び出すことは非常にまれでしょう。これは、Element を連想配列のキーとして使うことを想定して実装されています。
Examples:
Tag tag1,tag2 if (tag1 == tag2) { }
- 二つの Tag の比較
Examples:
Tag tag1,tag2 if (tag1 < tag2) { }
- Tag のハッシュ値を返します。
この関数を呼び出すことは非常にまれでしょう。これは、Element を連想配列のキーとして使うことを想定して実装されています。
- Tag の文字列表現を返します。
Examples:
auto tag = new Tag("book",TagType.START); writefln(tag.toString); // 出力は "<book>"
- 開始タグならば true を返します。
Examples:
if (tag.isStart) { }
- 終了タグならば true を返します。
Examples:
if (tag.isEnd) { }
- 空タグならば true を返します。
Examples:
if (tag.isEmpty) { }
- コメントノードを表すクラス
- this(string content);
- Comment の構築
Params:
string content コメントの内容
Throws:
内容が不正("--" を含むか、単独の "-")な場合 CommentException を投げます
Examples:
auto item = new Comment("This is a comment"); // <!--This is a comment--> を構築
- 二つの Comment の等値性を比較
Examples:
Comment item1,item2; if (item1 == item2) { }
- 二つの Comment を比較
この関数を呼び出すことは非常にまれでしょう。これは、Comment を連想配列のキーとして使うことを想定して実装されています。
Examples:
Comment item1,item2; if (item1 < item2) { }
- Comment のハッシュ値を計算
この関数を呼び出すことは非常にまれでしょう。これは、Comment を連想配列のキーとして使うことを想定して実装されています。
- このコメントの文字列表現を返します。
- 常に false
- CDATA セクションを表現するクラス
- this(string content);
- CDATA セクションの構築
Params:
string content CDATA セクションの内容
Throws:
内容が不正("]]>" を含む)場合、CDataException を投げます。
Examples:
auto item = new CData("<b>hello</b>"); // constructs <![CDATA[<b>hello</b>]]>
- 二つの CData の等値性比較
Examples:
CData item1,item2; if (item1 == item2) { }
- 二つの CData を比較
この関数を呼び出すことは非常にまれでしょう。これは、CData を連想配列のキーとして使うことを想定して実装されています。
Examples:
CData item1,item2; if (item1 < item2) { }
- CData のハッシュ値を計算
この関数を呼び出すことは非常にまれでしょう。これは、CData を連想配列のキーとして使うことを想定して実装されています。
- この CDATA セクションの文字列表現
- 常に false
- テキスト(PCDATA)セクションを表現するクラス
- this(string content);
- テキスト(PCDATA)セクションを構築
Params:
string content テキストの内容。この関数は構築前に自動的にテキストをエンコードするので、 任意のテキストを安全に挿入できます。
Examples:
auto Text = new CData("a < b"); // a < b を構築
- 二つの Text の等値性を比較
Examples:
Text item1,item2; if (item1 == item2) { }
- 二つの Text を比較
この関数を呼び出すことは非常にまれでしょう。これは、Text を連想配列のキーとして使うことを想定して実装されています。
Examples:
Text item1,item2; if (item1 < item2) { }
- Text のハッシュ値を計算
この関数を呼び出すことは非常にまれでしょう。これは、Text を連想配列のキーとして使うことを想定して実装されています。
- Text セクションの文字列表現を返します
- 中身が空文字列ならばtrue
- XML命令を表すクラス
- this(string content);
- XML命令セクションを構築
Params:
string content 命令セクションの内容
Throws:
中身が不正だった場合(">" を含む場合)XIException 例外を投げます
Examples:
auto item = new XMLInstruction("ATTLIST"); // <!ATTLIST> を構築
- 二つの XMLInstruction の等値性を比較
Examples:
XMLInstruction item1,item2; if (item1 == item2) { }
- 二つの XMLInstruction を比較
この関数を呼び出すことは非常にまれでしょう。これは、XMLInstruction を連想配列のキーとして使うことを想定して実装されています。
Examples:
XMLInstruction item1,item2; if (item1 < item2) { }
- XMLInstruction のハッシュ値を計算
この関数を呼び出すことは非常にまれでしょう。これは、XMLInstruction を連想配列のキーとして使うことを想定して実装されています。
- XMLInstruction の文字列表現
- 常に false
- Processing Instruction を表現するクラス
- this(string content);
- Processing Instruction を構築
Params:
string content 内容
Throws:
内容が不正("?>" を含む場合)な時 PIException 例外を投げます
Examples:
auto item = new ProcessingInstruction("php"); // <?php?> を構築
- 二つの Processing Instruction の等値性を比較
Examples:
ProcessingInstruction item1,item2; if (item1 == item2) { }
- 二つの Processing Instruction を比較
この関数を呼び出すことは非常にまれでしょう。これは、ProcessingInstruction を連想配列のキーとして使うことを想定して実装されています。
Examples:
ProcessingInstruction item1,item2; if (item1 < item2) { }
- ProcessingInstruction のハッシュ値を計算
この関数を呼び出すことは非常にまれでしょう。これは、ProcessingInstruction を連想配列のキーとして使うことを想定して実装されています。
- ProcessingInstruction の文字列表現
- 常にfalse
- XML項目の抽象基底クラス
- 同じ型の他のItemとの等値性比較
- 同じ型の他のItemとの比較
- このItemのハッシュ値
- このItemの文字列表現
- このItemのインデントされた文字列表現を返します
Params:
uint indent 子要素をインデントするスペースの個数
- 空XMLテキストを表現しているときのみtrueを返します。
- XML文書の構文解析のためのクラスです。
基底クラスは ElementParser で、 ほとんどの有用な関数はそちらでドキュメント化されています。
Standards:
XML 1.0
BUGS:
現在のところ、UTF ドキュメントのみのサポートです。
prolog の encoding 属性は無視されます。
- this(string xmlText_);
- DocumentParser の構築
入力は必ず valid な XML でなければなりません。 これはこの関数の事前条件で強制されます。
Params:
xmltext XML文書全体のテキスト
- XML要素の構文解析のためのクラス
Standards:
XML 1.0
直接このクラスのインスタンスを作ることはできないのでご注意下さい。DocumentParser (ElementParser の派生クラス)を使うか、 あなたの独自のライブラリで ElementParser を作って、onStartTag ハンドラに独自のやり方で渡すことは可能です。
- 現在解析中の要素の開始タグを表す Tag オブジェクト。
タグ名や要素を参照するのに使用できます。
- 指定した名前の開始タグが見つかったときに呼び出すハンドラを登録します。
名前の代わりに null を指定すると、
他のハンドラがマッチしなかった時の
ハンドラとして登録されます。
Examples:
// <podcast> 開始タグが見つかったら以下の関数を呼び出す onStartTag["podcast"] = (ElementParser xml) { // コードをここに記述 // // これはクロージャなので、このコードから // 外側のスコープの変数を参照できます }; // <episode> 開始タグが見つかったら // myEpisodeStartHandler (どこか他で定義されている) を呼び出す onStartTag["episode"] = &myEpisodeStartHandler; // その他全ての開始タグでは dg を呼び出す onStartTag[null] = dg;
ライブラリは、 関数に新しい ElementHandler のインスタンスを渡します。 これを使って、現在のタグの中の要素をさらに解析したり、 現在の要素のタグ属性を取得することなどが可能です。
この関数が開始タグのほかに空タグでも呼ばれることに注意してください。 つまり、 <br></br> と <br/> は全く区別されません。
- 指定した名前の終了タグが見つかったときに呼び出すハンドラを登録します。
名前の代わりに null を指定すると、
他のハンドラがマッチしなかった時の
ハンドラとして登録されます。
Examples:
// </podcast> 終了タグが見つかったら以下の関数を呼び出す onEndTag["podcast"] = (in Element e) { // コードをここに記述 // // これはクロージャなので、このコードから // 外側のスコープの変数を参照できます }; // </episode> 終了タグが見つかったら // myEpisodeEndHandler (どこか他で定義されている) を呼び出す onEndTag["episode"] = &myEpisodeEndHandler; // その他全ての終了タグでは dg を呼び出す onEndTag[null] = dg;
この関数が終了タグのほかに空タグでも呼ばれることに注意してください。 つまり、 <br></br> と <br/> は全く区別されません。
- テキストノードが見つかったときに呼び出すハンドラを登録
Examples:
// テキストノードが見つかったときにこの関数を呼び出す onText = (string s) { // コードをここに記述 // 渡される引数 s はデコード済みです // 従って、任意の文字を含む可能性があります // // これはクロージャなので、このコードから // 外側のスコープの変数を参照できます };
- テキストノードが見つかったときに呼び出す別の種類のハンドラを登録します。
onText との違いは、onText はテキストをデコードしますが、
onTextRaw はしない点です。
これによって、より正確だが遅い onText と
より速いが不正確な onTextRaw という選択が可能になります。
もちろん、onTextRaw のハンドラの中で decode() を呼ぶことはできますが、
普通は onTextRaw
はデコードが不要な状況でのみ使用することになります。
Examples:
// テキストノードが見つかったときにこの関数を呼び出す onText = (string s) { // コードをここに記述 // 渡される引数 s はデコード"されていません" // // これはクロージャなので、このコードから // 外側のスコープの変数を参照できます };
- CDATAセクションが見つかったときに
呼び出すハンドラを登録
Examples:
// CDATAセクションが見つかったときにこの関数を呼び出す onCData = (string s) { // コードをここに記述 // 渡される引数 s は開始 <![CDATA[ や // 終了 ]]> を含みません // // これはクロージャなので、このコードから // 外側のスコープの変数を参照できます };
- コメントが見つかったときに
呼び出すハンドラを登録
Examples:
// コメントが見つかったときにこの関数を呼び出す onComment = (string s) { // コードをここに記述 // 渡される引数 s は開始 <!-- や // 終了 --> を含みません // // これはクロージャなので、このコードから // 外側のスコープの変数を参照できます };
- Processing instruction
が見つかったときに呼び出すハンドラを登録
Examples:
// Processing Instruction が見つかったときにこの関数を呼び出す onPI = (string s) { // コードをここに記述 // 渡される引数 s は開始 <? や // 終了 > を含みません // // これはクロージャなので、このコードから // 外側のスコープの変数を参照できます };
- XML instruction
が見つかったときに呼び出すハンドラを登録
Examples:
// XML Instruction が見つかったときにこの関数を呼び出す // (注意点: XML Instruction は文書のルート要素より先に見つかるかもしれません) onPI = (string s) { // コードをここに記述 // 渡される引数 s は開始 <! や // 終了 > を含みません // // これはクロージャなので、このコードから // 外側のスコープの変数を参照できます };
- XML要素の構文解析を実行します。
解析は、現在の要素の終わりに達するまで続きます。 途中で見つかった Item に関しては全て、 対応するハンドラが登録されていれば呼び出されます。
Throws:
様々な種類の XMLException
- XML要素のうち、既に解析の済んだ部分の文字列表現を返します。
- XML文書全体が整形式(well-formed)となっているかチェックします。
Params:
string s チェック対象のXML文書。文字列で渡します。
Throws:
well-formed でない場合、CheckException を投げます。
CheckException の toString() メソッドは、構文解析失敗の完全な階層構造を出力します。 (スタックトレースのようなものです。)全ての階層で、 失敗した行番号と桁を表示します。
- このモジュールが投げる例外の基底クラス
- Comment コンストラクタで発生する例外
- CData コンストラクタで発生する例外
- XMLInstruction コンストラクタで発生する例外
- ProcessingInstruction コンストラクタで発生する例外
- Text コンストラクタで発生する例外
- decode() で発生する例外
- 型の違うItemを比較しようとしたときに発生する例外
- Tag の構文解析中に発生する例外
- check() で発生する例外
- 階層の親
- 構文解析に失敗した生成規則か、
具体的なエラーメッセージ
- 構文解析に失敗した行番号
- 構文解析に失敗した桁