XMLのインポート
XMLのインポート関数
Import
XMLデータは,標準Import関数を使ってWolfram言語にインポートできる.シンタックスは以下のようになる.
関数の第1引数はインポートするファイルを示している.第2引数(オプション)を指定すると,出力の形式が制御できる.XMLデータのインポートに使用できるファイル形式には"XML","ExpressionML","MathML"がありる.
インポート形式を"XML"とすると,Wolfram言語が認識しないXML形式はすべて記号的なXML式として返される.Wolfram言語はインポートにおいてExpressionMLおよびMathMLをサポートする.ExpressionMLファイルは対応するセル式としてインポートされ,MathMLファイルは対応するボックス式として返される.
インポート形式を"XML"とすると,ExpressionMLとMathMLも記号的なXMLとしてインポートされる.この指定を使うと,単にXMLとしてインポートするだけではなく,どのような解釈もオーバーライドする.
Importの引数が1つの場合は,Wolfram言語はファイルの拡張子に基づいてデータを処理する.拡張子.xmlを持つファイルはすべてXMLとしてインポートされる.Wolfram言語でサポートされている形式ExpressionMLおよびMathMLの場合は,ファイルは適切に解釈される.他のすべてのXML形式は記号的なXMLとしてインポートされる.
Import関数のオプションを指定することで,ホワイトスペースの処理方法,実体を認識するかどうか,DTDに対して妥当性を検証するかどうか等,インポート処理におけるさまざまな詳細を制御することができる.
ImportString
文字列からXMLデータをインポートするには標準のImportString関数を使う.
ImportString[string,format] | 文字列から特定の形式でインポートする |
XMLデータのインポートに使用できるファイル形式には,"XML","ExpressionML","MathML"がある.
インポート形式を"XML"とすると,Wolfram言語が認識しないXML形式はすべて記号的なXML式として返される.
ExpressionMLファイルは対応するセル式としてインポートされる.また,MathMLファイルは対応するボックス式として返される.
ImportString関数にオプションを指定することで,ホワイトスペースの処理方法,実体を認識するかどうか,DTDに対して妥当性を検証するかどうか等,インポート処理におけるさまざまな詳細を制御することができる.
XMLGet
XMLGet関数を使うと,XMLドキュメントを記号的なXMLとしてインポートすることができる.XMLGet[file]はXMLGet[file]と同じであるが,XMLGetにはURLに置かれたファイルが取り出せるという利点がある.
XMLGetはXML`Parser`コンテキストにのみ存在する.評価するときは関数の完全名XML`Parser`XMLGetを使わなければならない.コンテキスト名の接頭辞を使わずに関数を使う場合は,コンテキストパスにXML`Parser`コンテキストを加える.
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"]と同じである.
XMLGetStringはXML`Parser`コンテキストにのみ存在ので,評価するときは関数の完全名XML`Parser`XMLGetStringを使う.コンテキスト名の接頭辞なしで関数を使うには,コンテキストパスにXML`Parser`を加える.
XMLGetStringには,第2引数に初期化済みのパーサオブジェクトを取るという利点がある.
XMLGetString[string,xmlParserObject] | 初期化済みのパーサを使って文字列からインポートする |
パーサを初期化すると,DTDがURLまたはローカルファイルからロードされる.これを行う必要があるのは,各カーネルセッションにつき1度だけである.その後のDTDの参照は格段に速くなる.パーサの初期化についてはInitializeXMLParserを参照のこと.
XMLGetStringにオプションを指定することもできる.XMLGetStringのオプションはImportStringのものと同じであるが,シンタックスが少し違う.XMLGet関数では,以下のようにオプションを直接指定することができる.
XMLGetString[string,option1->value1,option2->value2,…]
ImportString[string,"XML",option1->value1,option2->value2,…].
実体と妥当性の検証
XMLドキュメントは,Unicode文字セットに含まれるすべての文字を含むことができる.
ImportはXMLデータがDTDで定義されているコンテントモデルに適合しているかどうかを確認するために,妥当性を検証することもできる.ドキュメントが整形式であれば,記号的なXML式が返される.ドキュメントが妥当でなければ,警告メッセージを発し,ドキュメントラッパーのオプションがValid->Falseとなり,ドキュメントが妥当でないことを示す.
Import関数にオプションを指定することで,実体をどのように処理するか,ドキュメントの妥当性を検証するかどうか等を制御することができる.
インポートオプション
はじめに
Importの標準オプションを使うと,インポート処理をより詳細に制御できる.オプションを指定するシンタックスは以下のようになる.
Import[file,option->value].
"NormalizeWhitespace"
このオプションは,ホワイトスペースの処理方法を制御するものである.ホワイトスペースは空白,タブ,あるいは改行文字として定義される.
オプション | 値 | 動作 |
"NormalizeWhitespace" | True | 要素内のすべてのホワイトスペースを正規化する(デフォルト) |
False | もとのXMLドキュメントのすべてのホワイトスペースを残す | |
Automatic | 無視できるホワイトスペースは無視し,無視できないもののみ残す |
ホワイトスペースの正規化とは,前後のホワイトスペースが取り除かれ,内部のホワイトスペースが1つの空白文字に縮小されるということである.このオプションのデフォルトの設定は"NormalizeWhitespace"->Trueである.
ホワイトスペースは,DTDで定義されている内容モデルで文字データが許可されていない場所に置かれている場合,削除することができる.この削除できるホワイトスペースは,主にフォーマットの目的でインデントするために使われている.
"NormalizeWhitespace"->Falseが指定されていると,介在するホワイトスペースのために,結果の記号的なXML式のパターンマッチングが難しくなることがある.
"AllowRemoteDTDAccess"
このオプションは,DTDを取り出すためにパーサがネットワークにアクセスするかどうかを制御するためのものである.
"AllowRemoteDTDAccess"->Falseで,ドキュメントがリモートのDTDを参照する場合は,オプション"ReadDTD"もFalseに設定されていない限りエラーメッセージが表示され,パースが失敗する.
"AllowUnrecognizedEntities"
このオプションは,XMLドキュメントの中に未定義の実体参照があった場合に,パーサが何を行うかを指定するものである.
オプション | 値 | 動作 |
"AllowUnrecognizedEntities" | True | 未定義の実体はすべて特別な実体区切り文字でラップされ,エラーメッセージは報告されない |
False | エラーメッセージが返され,パースは失敗する | |
Automatic | 認識されないすべての実体についてエラーメッセージが返され,実体は特別な実体区切り文字でラップされる (デフォルト) |
"ReadDTD"
このオプションは,外部のDTDサブセットが読まれるかどうかを指定するものである.DTDの最も重要な役割は,妥当性検証のための内容モデルを定義することと,文字実体を定義することである.
DTDを読むことはドキュメントの内容に直接関係してくるため,"ReadDTD"->Falseがデフォルトの値となっている."ReadDTD"->Falseとすると効率が改善できるかもしれないが,この変更を行うのはDTDの情報が必要でないことが確かな場合のみでなければならない.
パーサがDTDを読まないようにする唯一の設定は"ReadDTD"->Falseである."AllowRemoteDTDAccess"->Falseと設定するとネットワークアクセスが行われず,"ValidateAgainstDTD"-> Falseとすると妥当性検証が行われないが,どちらのオプションもパーサのDTD読込みの失敗によるエラーを防ぐことはできない.
初期化済みのパーサを使う場合は"ReadDTD"は無視される.初期化済みのパーサについての詳しい情報はInitializeXMLParserを参照のこと.
"ValidateAgainstDTD"
このオプションは,XMLドキュメントの妥当性を検証するかどうかを指定するものである.
オプション | 値 | 動作 |
"ValidateAgainstDTD" | True | XMLドキュメントにDOCTYPE宣言が含まれていない場合でもインポート時に妥当性検証が試みられる |
False | インポートの際に妥当性検証は行われない | |
Automatic | XMLドキュメントにDOCTYPE宣言が含まれている場合に限り妥当性検証が試みられる(デフォルト) |
ドキュメントが妥当であれば,パーサはXMLObject["Document"]オプションを"Valid"->Trueのように設定する.ドキュメントが妥当でなければ,パーサは妥当性エラーメッセージを発し,"Valid"->Falseと設定する.
"ValidateAgainstDTD"->Automaticとすると,初期化済みのパーサを使う場合でも,ドキュメントにDOCTYPEがある場合を除いては妥当性検証が行われない.
"IncludeDefaultedAttributes"
この変換オプションは,デフォルトの属性としてDTDで指定されている属性を記号的なXML式に含むかどうかを指定するものである.デフォルトでは,このオプションは"IncludeDefaultedAttributes"->Falseとなっている.これは,アプリケーション開発者はこの属性のデフォルトの値を知っているため,その値を記号的なXML式に含む必要がないからである."IncludeDefaultedAttributes"->Trueとすると,値が記号的なXML式に含まれる.
"IncludeDefaultedAttributes"の値
"IncludeEmbeddedObjects"
このオプションは,ドキュメントツリーの中で生じるコメントと処理命令の扱い方を設定するものである.
オプション | 値 | 動作 |
"IncludeEmbeddedObjects" | All | 埋め込まれたオブジェクトはすべてドキュメントツリーに含まれる |
None | 埋め込まれたオブジェクトは含まれない(デフォルト) | |
Comments | 埋め込まれたコメントだけが含まれる | |
ProcessingInstructions | 埋め込まれた処理命令だけが含まれる |
{"Comments","ProcessingInstructions"}
とすると,埋め込まれているコメントと処理命令のリストが含まれる.
"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ドキュメントのデータモデルにより近い形となる.また,この形はパターンマッチングにおいてより使いやすいことがある.
False
"IncludeNamespaces"->Falseと指定すると,各要素または属性のローカル名についてのみ報告される.この値を使うと,記号的なXML式は読みやすくなるが,名前空間が1つだけであるアプリケーション以外では使わないようにされたい.この設定でパースした場合は,子要素名がすべて同じに見える.つまりこのオプション値は,複数の名前空間が使われているときは信頼できないということになる.
Automatic
デフォルトの値"IncludeNamespaces"->Automaticでは,名前空間はスコープによって決定される.要素の名前空間がデフォルトの名前空間と等しい場合は,名前はローカル名に対して1つの文字列で表される.要素の名前空間が異なる場合は,名前は{名前空間,ローカル名}という構造のリストで表される.
例えば,名前が2つの文字列のリストで表されている唯一の要素はhttp://anothernamespace.comの名前空間にあるものである.別の要素はhttp://mynamespace.comの名前空間に暗示的に含まれている.W3Cの仕様によると,属性と要素の名前空間のスコープは異なるため,属性は集約されない.
Unparsed
XMLを拡張するXML名前空間についての勧告は最初のXMLが勧告された後に行われたため,ドキュメントによっては名前空間に準拠しない形の名前を使っているものがある.このようなドキュメントをパースするために"IncludeNamespaces"->"Unparsed"という設定がある.名前は常に単一の文字列,つまりXMLファイルにある文字列そのものとして表される.絶対に必要である場合を除いては,このオプションの値は使うべきではない.
"PreserveCDATASections"
このオプションは,インポートの際にCDATA部分と一般の文字データの区別を維持するかどうかを指定するものである.CDATAセクションはドキュメントの著者に便利であるように意図されたものである.ほとんどのアプリケーションでは,この部分は一般のデータとは別に扱われるべきではない.CDATAセクションを維持すると,パターンマッチングが難しくなる.そのため,デフォルトの設定はFalseとなっている.