XMLのインポート
XMLのインポート関数
Import
XMLデータは,標準Import関数を使って Mathematica にインポートできる.シンタックスは以下のようになる.
| Import[file] | ファイルの拡張子に従ってインポート形式を決定する |
| Import[file,format] | 特定の形式からインポートする |
ファイルのインポート
関数の第1引数はインポートするファイルを示している.第2引数(オプション)を指定すると,出力の形式が制御できる.XMLデータのインポートに使用できるファイル形式には"XML","ExpressionML","MathML"がありる.
インポート形式を"XML"とすると,Mathematica が認識しないXML形式はすべて記号的なXML式として返される.Mathematica はインポートにおいてExpressionMLおよびMathMLをサポートする.ExpressionMLファイルは対応するセル式としてインポートされ,MathMLファイルは対応するボックス式として返される.
インポート形式を
とすると,ExpressionMLとMathMLも記号的なXMLとしてインポートされる.この指定を使うと,単にXMLとしてインポートするだけではなく,どのような解釈もオーバーライドする.
| Out[1]= |  |
このファイルをインポートすると,式はボックス式として返される.
| Out[2]= |  |
Import要素として

を指定すると,式は記号的なXML式としてインポートされる.
| Out[3]= |  |
Importの引数が1つの場合は,Mathematica はファイルの拡張子に基づいてデータを処理する.拡張子.xmlを持つファイルはすべてXMLとしてインポートされる.Mathematica でサポートされている形式ExpressionMLおよびMathMLの場合は,ファイルは適切に解釈される.他のすべてのXML形式は記号的なXMLとしてインポートされる.
| Out[4]= |  |
Out[5]//DisplayForm= |
| |  |
Import関数のオプションを指定することで,ホワイトスペースの処理方法,実体を認識するかどうか,DTDに対して妥当性を検証するかどうか等,インポート処理におけるさまざまな詳細を制御することができる.
ImportString
文字列からXMLデータをインポートするには標準のImportString関数を使う.
文字列のインポート
XMLデータのインポートに使用できるファイル形式には,"XML","ExpressionML","MathML"がある.
インポート形式を"XML"とすると,Mathematica が認識しないXML形式はすべて記号的なXML式として返される.
| Out[6]= |  |
ExpressionMLファイルは対応するセル式としてインポートされる.また,MathMLファイルは対応するボックス式として返される.
簡単なMathML式をインポートする.MathMLマークアップは自動的に
Mathematica ボックス式に変換される.
| Out[7]= |  |
Import要素として

を指定して,インポートしたファイルの自動解釈をやめることもできる.
| Out[8]= |  |
ImportString関数にオプションを指定することで,ホワイトスペースの処理方法,実体を認識するかどうか,DTDに対して妥当性を検証するかどうか等,インポート処理におけるさまざまな詳細を制御することができる.
XMLGet
XMLGet関数を使うと,XMLドキュメントを記号的なXMLとしてインポートすることができる.XMLGet[file]はXMLGet[file]と同じであるが,XMLGetにはURLに置かれたファイルが取り出せるという利点がある.
XMLGetは
コンテキストにのみ存在する.評価するときは関数の完全名
を使わなければならない.コンテキスト名の接頭辞を使わずに関数を使う場合は,コンテキストパスに
コンテキストを加える.
XMLGetは第2引数(オプション)も取る.これは初期化済みのパーサオブジェクトを指定するものである.
| XMLGet[file,xmlParserObject] | 初期化済みのパーサを使ってインポートする |
パーサを初期化すると,DTDがURLまたはローカルファイルからロードされる.これを行う必要があるのは,各カーネルセッションにつき1度だけである.その後のDTDの参照は格段に速くなる.パーサの初期化についてはInitializeXMLParserを参照のこと.
また,XMLGetにオプションを指定することもできる.XMLGetのオプションは,Importのものと同じであるが,シンタックスが少し違う.XMLGet関数では,以下のように直接オプションを指定することができる.
XMLGet[file, option1->value1, option2->value2, ...]
これは次のものと同じである.
Import[file, "XML", option1->value1, option2->value2, ...].
XMLGetString
XMLGetString関数を使うと,XML文字列を記号的なXMLとしてインポートすることができる.XMLGetString[string]はImportString[string, "XML"]と同じである.
| Out[9]= |  |
XMLGetStringは
コンテキストにのみ存在ので,評価するときは関数の完全名
を使う.コンテキスト名の接頭辞なしで関数を使うには,コンテキストパスに
を加える.
XMLGetStringには,第2引数に初期化済みのパーサオブジェクトを取るという利点がある.
| XMLGetString[string,xmlParserObject] | 初期化済みのパーサを使って文字列からインポートする |
パーサを初期化すると,DTDがURLまたはローカルファイルからロードされる.これを行う必要があるのは,各カーネルセッションにつき1度だけである.その後のDTDの参照は格段に速くなる.パーサの初期化についてはInitializeXMLParserを参照のこと.
まずXMLパッケージをロードし,指定のURIにあるXHTML DTDに従ってパーサ

を初期化する.
| Out[10]= |  |
XML文字列をインポートする.
"ValidateAgainstDTD"->Trueとすると,

に保存されているDTDについて,文字列の妥当性が検証される.出力中の
Valid->Trueは,XML入力文字列がXHTMLのDTDについて妥当であることを示している.
| Out[11]= |  |
XMLGetStringにオプションを指定することもできる.XMLGetStringのオプションはImportStringのものと同じであるが,シンタックスが少し違う.XMLGet関数では,以下のようにオプションを直接指定することができる.
XMLGetString[string, option1->value1, option2->value2, ...]
これは以下のものと同じである.
ImportString[string, "XML", option1->value1, option2->value2, ...].
実体と妥当性の検証
XMLドキュメントは,Unicode文字セットに含まれるすべての文字を含むことができる.
XMLドキュメントを
Mathematica にインポートするとき,数値的なUnicode文字の実体参照はすべて自動的に
Mathematica 文字に置換される.
| Out[12]= |  |
XMLに組み込まれていないその他の実体は,DTD中の規則に従って変換される.
| Out[13]= |  |
ImportはXMLデータがDTDで定義されているコンテントモデルに適合しているかどうかを確認するために,妥当性を検証することもできる.ドキュメントが整形式であれば,記号的なXML式が返される.ドキュメントが妥当でなければ,警告メッセージを発し,ドキュメントラッパーのオプションがValid->Falseとなり,ドキュメントが妥当でないことを示す.
Import関数にオプションを指定することで,実体をどのように処理するか,ドキュメントの妥当性を検証するかどうか等を制御することができる.
インポートオプション
はじめに
Importの標準オプションを使うと,インポート処理をより詳細に制御できる.オプションを指定するシンタックスは以下のようになる.
Import[file, option->value].
XMLデータのインポートの際は,以下のオプションが使える.
"NormalizeWhitespace"
このオプションは,ホワイトスペースの処理方法を制御するものである.ホワイトスペースは空白,タブ,あるいは改行文字として定義される.
| | |
| "NormalizeWhitespace" | True | 要素内のすべてのホワイトスペースを正規化する(デフォルト) |
| False | もとのXMLドキュメントのすべてのホワイトスペースを残す |
| Automatic | 無視できるホワイトスペースは無視し,無視できないもののみ残す |
の値
ホワイトスペースの正規化とは,前後のホワイトスペースが取り除かれ,内部のホワイトスペースが1つの空白文字に縮小されるということである.このオプションのデフォルトの設定は"NormalizeWhitespace"->Trueである.
ホワイトスペースは,DTDで定義されている内容モデルで文字データが許可されていない場所に置かれている場合,削除することができる.この削除できるホワイトスペースは,主にフォーマットの目的でインデントするために使われている.
デフォルトの設定
"NormalizeWhitespace"->Trueでホワイトスペースを処理する.
| Out[14]= |  |
"NormalizeWhitespace"->Falseとすると,もとの文字列にあったようにホワイトスペースが残される.
| Out[15]= |  |
"NormalizeWhitespace"->Falseが指定されていると,介在するホワイトスペースのために,結果の記号的なXML式のパターンマッチングが難しくなることがある.
"AllowRemoteDTDAccess"
このオプションは,DTDを取り出すためにパーサがネットワークにアクセスするかどうかを制御するためのものである.
| | |
| "AllowRemoteDTDAccess" | True | パーサは自動的にネットワークにアクセスしてDTDを取り出す |
| False | リモートDTDは取り出されないが,ローカルのDTDが使える |
の値
"AllowRemoteDTDAccess"->Falseで,ドキュメントがリモートのDTDを参照する場合は,オプション
もFalseに設定されていない限りエラーメッセージが表示され,パースが失敗する.
"AllowUnrecognizedEntities"
このオプションは,XMLドキュメントの中に未定義の実体参照があった場合に,パーサが何を行うかを指定するものである.
| | |
| "AllowUnrecognizedEntities" | True | 未定義の実体はすべて特別な実体区切り文字でラップされ,エラーメッセージは報告されない |
| False | エラーメッセージが返され,パースは失敗する |
| Automatic | 認識されないすべての実体についてエラーメッセージが返され,実体は特別な実体区切り文字でラップされる (デフォルト) |
の値
次の例には未定義の実体「dogs」が含まれている.

が
Falseの場合,エラーメッセージが返され,パースが失敗する.
| Out[16]= |  |
デフォルトの設定
Automaticでは,エラーメッセージが報告され,実体は特別な実体区切り文字でラップされる.しかし,これによりXMLデータのインポートとパースが阻止される訳ではない.
| Out[17]= |  |
"AllowUnrecognizedEntities"->Trueの場合は,未定義の実体が特殊な実体区切り文字でラップされ,エラーメッセージは報告されない.
| Out[18]= |  |
"ReadDTD"
このオプションは,外部のDTDサブセットが読まれるかどうかを指定するものである.DTDの最も重要な役割は,妥当性検証のための内容モデルを定義することと,文字実体を定義することである.
| | |
| "ReadDTD" | True | 外部DTDが読み込まれる (デフォルト) |
| False | 外部DTDは無視される |
の値
DTDを読むことはドキュメントの内容に直接関係してくるため,"ReadDTD"->Falseがデフォルトの値となっている."ReadDTD"->Falseとすると効率が改善できるかもしれないが,この変更を行うのはDTDの情報が必要でないことが確かな場合のみでなければならない.
パーサがDTDを読まないようにする唯一の設定は"ReadDTD"->Falseである."AllowRemoteDTDAccess"->Falseと設定するとネットワークアクセスが行われず,"ValidateAgainstDTD"-> Falseとすると妥当性検証が行われないが,どちらのオプションもパーサのDTD読込みの失敗によるエラーを防ぐことはできない.
初期化済みのパーサを使う場合は
は無視される.初期化済みのパーサについての詳しい情報はInitializeXMLParserを参照のこと.
"ValidateAgainstDTD"
このオプションは,XMLドキュメントの妥当性を検証するかどうかを指定するものである.
| | |
| "ValidateAgainstDTD" | True | XMLドキュメントにDOCTYPE宣言が含まれていない場合でもインポート時に妥当性検証が試みられる |
| False | インポートの際に妥当性検証は行われない |
| Automatic | XMLドキュメントにDOCTYPE宣言が含まれている場合に限り妥当性検証が試みられる(デフォルト) |
の値
ドキュメントが妥当であれば,パーサはXMLObject["Document"]オプションを"Valid"->Trueのように設定する.ドキュメントが妥当でなければ,パーサは妥当性エラーメッセージを発し,"Valid"->Falseと設定する.

を
Trueに設定して,妥当でないドキュメントをパースする.パーサはエラーメッセージを返す.
ドキュメントが妥当である場合は,メッセージは生じず,出力に
"Valid"->Trueが含まれる.
Out[20]//InputForm= |
| |  |
Out[21]//InputForm= |
| |  |
Out[22]//InputForm= |
| |  |

を
Trueに設定すると,DOCTYPE宣言がなくても妥当性検証が試みられる.
DOCTYPE宣言がある場合にのみ妥当性検証が行われるようにするには,
"ValidateAgainstDTD"->Automaticを使います.DTDが指定されていない場合は,パーサはXML文字列の妥当性検証を試みない.
| Out[24]= |  |
次の例ではDTDが明示的に指定されているので,パーサは入力文字列の妥当性検証を試みる.
"ValidateAgainstDTD"->Automaticとすると,初期化済みのパーサを使う場合でも,ドキュメントにDOCTYPEがある場合を除いては妥当性検証が行われない.
"IncludeDefaultedAttributes"
この変換オプションは,デフォルトの属性としてDTDで指定されている属性を記号的なXML式に含むかどうかを指定するものである.デフォルトでは,このオプションは"IncludeDefaultedAttributes"->Falseとなっている.これは,アプリケーション開発者はこの属性のデフォルトの値を知っているため,その値を記号的なXML式に含む必要がないからである."IncludeDefaultedAttributes"->Trueとすると,値が記号的なXML式に含まれる.
| | |
| "IncludeDefaultedAttributes" | True | DTDのデフォルトの属性が記号的なXML式に含まれる |
| False | デフォルトの属性は含まれない(デフォルト) |
の値
| Out[27]= |  |
インポートされた記号的なXMLにデフォルトの属性を含むようにするためには,

を
Trueに設定する.
| Out[28]= |  |
デフォルトの属性を式に含むことと妥当性検証は同じことではない.そのため,
"ValidateAgainstDTD"->Falseでも属性を含むことができる.
| Out[29]= |  |
"IncludeEmbeddedObjects"
このオプションは,ドキュメントツリーの中で生じるコメントと処理命令の扱い方を設定するものである.
| | |
| "IncludeEmbeddedObjects" | All | 埋め込まれたオブジェクトはすべてドキュメントツリーに含まれる |
| | None | 埋め込まれたオブジェクトは含まれない(デフォルト) |
| | Comments | 埋め込まれたコメントだけが含まれる |
| | ProcessingInstructions | 埋め込まれた処理命令だけが含まれる |
の値
今後の例題を簡単にするため,変数が簡単なXMLフラグメントを表すように設定する.
"IncludeEmbeddedObjects"->Allとすると,埋め込まれているすべてのオブジェクトがドキュメントのツリーに含まれる.
| Out[31]= |  |
コメントと処理命令はXMLドキュメントを使うアプリケーションに影響することを意図するものではないので,

のデフォルトの設定は
Noneである.これらを含むとパターンマッチングを妨げる危険性が生じる.
| Out[32]= |  |

または

と設定すると,それぞれ埋め込まれている処理命令またはコメントのみが含まれる.

を

とすると,埋め込まれているコメントと処理命令のリストが含まれる.
| Out[33]= |  |
| Out[34]= |  |
| Out[35]= |  |
"IncludeNamespaces"
このオプションは名前空間がどのように扱われるかを指定するものである.
| | |
| "IncludeNamespaces" | True | 各要素と属性について明示的な名前空間を指定する |
| False | 名前空間情報は報告されない |
| Automatic | 名前空間はスコープにより決定される(デフォルト) |
| Unparsed | 標準的ではない方法で名前空間を使うドキュメントの処理に使用される |
の値
変数が名前空間を含む簡単なXMLフラグメントを表すように設定する.
<root xmlns="http://mynamespace.com"
xmlns:same="http://mynamespace.com"
xmlns:foo="http://anothernamespace.com">
<child attr1="a" same:attr2="b" foo:attr3="c"/>
<foo:child/>
<same:child/>
</root>
True
"IncludeNamespaces"->Trueとすると,各要素と属性の名前空間情報が
という形のリストで報告される.これは冗長な形であるが,XMLドキュメントのデータモデルにより近い形となる.また,この形はパターンマッチングにおいてより使いやすいことがある.
| Out[37]= |  |
False
"IncludeNamespaces"->Falseと指定すると,各要素または属性のローカル名についてのみ報告される.この値を使うと,記号的なXML式は読みやすくなるが,名前空間が1つだけであるアプリケーション以外では使わないようにされたい.この設定でパースした場合は,子要素名がすべて同じに見える.つまりこのオプション値は,複数の名前空間が使われているときは信頼できないということになる.
| Out[38]= |  |
Automatic
デフォルトの値"IncludeNamespaces"->Automaticでは,名前空間はスコープによって決定される.要素の名前空間がデフォルトの名前空間と等しい場合は,名前はローカル名に対して1つの文字列で表される.要素の名前空間が異なる場合は,名前は
という構造のリストで表される.
例えば,名前が2つの文字列のリストで表されている唯一の要素はhttp://anothernamespace.comの名前空間にあるものである.別の要素はhttp://mynamespace.comの名前空間に暗示的に含まれている.W3Cの仕様によると,属性と要素の名前空間のスコープは異なるため,属性は集約されない.
| Out[39]= |  |
Unparsed
XMLを拡張するXML名前空間についての勧告は最初のXMLが勧告された後に行われたため,ドキュメントによっては名前空間に準拠しない形の名前を使っているものがある.このようなドキュメントをパースするために
という設定がある.名前は常に単一の文字列,つまりXMLファイルにある文字列そのものとして表される.絶対に必要である場合を除いては,このオプションの値は使うべきではない.
| Out[40]= |  |
"PreserveCDATASections"
このオプションは,インポートの際にCDATA部分と一般の文字データの区別を維持するかどうかを指定するものである.CDATAセクションはドキュメントの著者に便利であるように意図されたものである.ほとんどのアプリケーションでは,この部分は一般のデータとは別に扱われるべきではない.CDATAセクションを維持すると,パターンマッチングが難しくなる.そのため,デフォルトの設定はFalseとなっている.
| | |
| "PreserveCDATASections" | True | CDATA部分についての情報が維持される |
| False | CDATA部分についての情報は削除される |
の値

のデフォルトの動作の例.
| Out[41]= |  |
CDATAセクションを維持するためには
"PreserveCDATASections"->Trueと指定する.
| Out[42]= |  |