Wolfram言語におけるXMLの表現
XMLとWolfram言語
Wolfram言語では,広範囲に渡ってXMLがサポートされている.XMLとは,W3C (World Wide Web Consortium)によって開発された,構造化ドキュメントおよびデータを表現するためのマークアップ言語である.Wolfram言語のXML機能を使うと,以下のようなことが可能である.
このような機能により,Wolfram言語はXMLドキュメントを作成し処理する強力な開発環境となる.また,Wolfram言語と他のXMLアプリケーション間,またはノートブックと他のXMLドキュメント形式の間での完全な相互運用が可能となる.
ネイティブXML形式
Wolfram言語はMathML,SVG,ExpressionML,JVX,X3D,VRML,XHTML等,多くのXML形式を組込みサポートしている.これらのいずれかの形式を使っているドキュメントをインポートすると,特定のタイプのWolfram言語式に自動的に変換される.ExpressionMLファイルはセル式としてインポートされ,MathMLファイルはボックス式として返される.
MathML
MathMLはW3Cによって数式の構造と意味を記述するために開発れたXML形式である.これはWeb上で数式表現を表示するための標準である.Wolfram言語はMathMLの生成と操作や,MathMLとWolfram言語で数式を表現するために内部的に使われている式との間の変換の他,MathMLのインポートとエキスポートもサポートしている.
このようなMathMLの機能により,Wolfram言語はMathMLの内容を書き,編集するための優れた環境となる.例えば,Wolfram言語のパワフルなタイプセットシステムを使って適切にフォーマットされた式を作成し,その式をMathML形式でHTMLドキュメントにペーストすると,Web上で表示できるようになる.他のアプリケーションのMathML式をインポートし,Wolfram言語で評価することも可能である.
SVG
SVG (Scalable Vector Graphics)は2Dグラフィックスの表現のためにW3Cが開発したXML形式である.SVG画像は損失なくサイズ変更でき,また,通常JPEGやGIF画像と比較して格段にファイルサイズが小さくなる.SVGファイルは,動的かつインタラクティブなグラフィックスを生成するために,スクリプト言語を使って操作することができる.Mathematica 4.2以降を使うと,ノートブック中のどのグラフィックスも,直接SVG形式にエキスポートできる.
ExpressionML
ExpressionMLはどのようなWolfram言語式でもXML形式で表現することができる.
記号的なXML
記号的なXMLとは
記号的なXMLはXMLドキュメントを表現するためにWolfram言語で使われる形式である.XMLを記号的なXMLに変換すると,XMLドキュメントはその構造を保ったままWolfram言語式に変換される.XMLドキュメントとWolfram言語式は木構造を取っているため,どちらからどちらへの変換にも自然なマッピングができる.その後Wolfram言語プログラミングの標準的手法を使って記号的なXML式を操作することもできる.
XMLデータは,標準のImportまたはImportString関数を使ってWolfram言語にインポートできる.オプションを設定すると,ホワイトスペースの処理方法や実体を認識するかどうか,またはDTDに対して妥当性を検証するかどうか等,インポート処理におけるさまざまな詳細も制御できる.
次のコマンドはXMLデータをWolfram言語にインポートする.
結果は記号的なML式 expr1 となる.この式は標準のWolfram言語コマンドを使って操作できる.変換の最終結果は別の記号的なXML式 expr2 となる.
最後に,標準Export関数を使って結果をXMLファイルにエキスポートできる.
Export["newdata.xml",expr2,"XML"]
オプションを使うとエキスポート後のXMLのフォーマット等,エキスポート処理におけるさまざまな詳細が制御できる.
記号的なXMLとWolfram言語プログラミングを組み合わせることで,XSLT変換やJava等の低レベルプログラミング言語で使われるSAXやDOM API等,XMLドキュメントの操作のためのその他の方法を代替することができるので便利である.Wolfram言語でもこれらと同程度の柔軟で制御性に富んだXMLドキュメントの処理が可能となる.Wolfram言語の記号操作と数値計算の高度なサポートを,その他の方法では難しい,あるいは不可能な非常に複雑で高度な変換に利用できる.
例えば,パターンマッチング技術を使ってXMLドキュメントの特定の部分を抽出し,データに対して数値計算を行い,可視化のために結果を3Dグラフィックスに変換できる.また,あるタイプのXMLアプリケーションをその他のものに変換するための定義もできます.例えば,DocBookドキュメントを記号的なXMLとしてインポートし,要素名を他の要素名に変換する適切な変換規則を定義して,XHTML形式に変換することもできる.記号的なXMLの便利な具体的応用例はXMLの変換を参照されたい.
記号的なXMLのサポートは,ExpressionML,MathMLとうまく統合されている.ExpressionMLとMathMLを記号的なXMLとしてインポートしたり,ExpressionMLを式として,MathMLをタイプセットボックス式としてインポートしたりすることができる.文字列,ボックス,式と,MathML,記号的なXML間の変換を素早く簡単にするためのカーネル関数は数多く存在する.
直接Javaを使ってXMLドキュメントを操作したい場合は,J/Linkアドオンパッケージを使って行える.このパッケージはWolfram言語を完全にJavaと統合し,Wolfram言語からJavaのコマンド,あるいはJavaプログラムからWolfram言語カーネル関数が呼び出せるようになる.従ってWolfram言語の計算能力とJavaの低レベルプログラミング機能とクラスの両方にアクセスできるようになり,必要に応じてこの2つを組み合せることも可能となる.
要素の表現
XMLドキュメントの各要素は,記号的なXMLではXMLElementオブジェクトに相当する.次のような形式のXML式
< element attribute =' value '> data </ element >
XMLElement[element,{attribute->value},{data}]
各XMLElement[]式は3つの引数を取る.
- 第3引数は要素に含まれる実際のデータを指定するものである.これは文字列としての実際の文字データ,表現される要素の子要素,またはその両方となる.各子要素は各々のXMLElement[]式で表現される.もとのXML式のネスト構造を反映するのに必要なレベルまで,複数のXMLElement[]式をネストすることもできる.
XMLドキュメントに含まれる文字データ,要素名,属性名は,記号的なXMLでは文字列として表される.これは多くの新しいシンボルがWolframシステムに導入されて名前の重複が起るのを防ぐためである.
<book type='novel'>Moby Dick</book>
XMLElement["book",{"type"->"novel"},{"Moby Dick"}]
<book type='novel'> <title>Moby Dick</title> <author born='1819' died='1891'> <name> <first>Herman</first> <last>Melville</last> </name> </author> </book>
名前空間の処理
XML要素で名前空間が指定されていたら,対応する記号的なXML式のシンタックスはやや複雑になる.実際のシンタックスは,名前空間がデフォルトの名前空間として暗に指定されているか,または名前空間接頭辞を使って明示的に指定されているかに依存する.
デフォルトの名前空間の使用
デフォルトの名前空間にあるどの要素に対しても,XMLElement式は名前空間が指定されてない場合のものと同じである.しかし,デフォルトの名前空間が宣言されている要素は,そのXMLElement式に変更が加えられる.
以下は名前空間がhtml要素で宣言されている簡単なXHTMLドキュメントの例である.
<html xmlns='http://www.w3.org/1999/xhtml'> <head> </head> <body> <p>Here is some text.</p> </body> </html>
html要素を表しているXMLElement式が複雑な構造を取っていることに注意されたい.第2引数は次のようになっている.
{{"http://www.w3.org/2000/xmlns/","xmlns"}->"http://www.w3.org/1999/xhtml"}
- XMLの仕様で要求されているように,URI (Universal Resource Identifier) http://www.w3.org/2000/xmlnsで定義される名前空間で属性xmlnsを識別する.
一般に,ある要素に対してデフォルトの名前空間を宣言すると,対応するXMLElement構造のシンタックスは次のようになる.
XMLElement[element,{{xmlns_uri,"xmlns"}-> namespace_uri},{data}].
ここで xmlns_uri はxmlns属性の名前空間に関連付けられているURI,namespace_uri は宣言されるデフォルトの名前空間のURIである.
明示的な名前空間接頭辞を使う
要素の名前空間が名前空間接頭辞を使って明示的に指定されているときは,以下の例に示すように,記号的なXML式のシンタックスが変更される.
以下にMathMLマークアップが埋め込まれているXHTMLドキュメントを示す.math要素中のxmlns:m属性によって,名前空間接頭辞mとMathML名前空間が結び付けられる.すべてのMathML要素名はこの名前空間接頭辞が付加した形で書かれる.
<html xmlns='http://www.w3.org/1999/xhtml'> <head> <title>Test</title> </head> <body> <p>Here is some math.</p> <p> <m:math xmlns:m='http://www.w3.org/1998/Math/MathML'> <m:mi>x</m:mi> <m:mo>+</m:mo> <m:mn>1</m:mn> </m:math> </p> </body> </html>
- 最上位のmath要素に対するXMLElement構造の最初の属性は{"http://www.w3.org/2000/xmlns/","m"}->"http://www.w3.org/1998/Math/MathML"となる.これはMathML名前空間と接頭辞mを関連付ける.
- 各MathML要素に対するXMLElement構造はXMLElement[{uri,element},{},{data}]という形になる.ここで,uri はMathML名前空間を識別するためのものである.これは,名前空間接頭辞が付加された形の要素名に対応する記号的なXMLでの記述である.
他のオブジェクトの表現
XMLObject式はXMLドキュメントの要素以外のもの(コメント,処理命令,宣言等)のコンテナとして使われる.これはドキュメント全体のコンテナとしても使用されます.この構造のシンタックスはXMLObject[object][data]という形である.ここで object は表されるオブジェクトのタイプを表し,data はオブジェクトの詳細を指定するものである.第1引数として指定できるものには6種類のタイプのオブジェクトがあり,各オブジェクトタイプがXMLドキュメントの特定のタイプのコンストラクトに対応する.
Declaration
XMLObject["Declaration"]式はXML宣言を表す.XML宣言は通常XMLドキュメントの冒頭に置かれる.シンタックスは以下のようになる.
XMLObject["Declaration"]["Version"->"1.0", option->value]
<?xml version="1.0" encoding="ascii" standalone="yes"?>
Comment
XMLObject["Comment"]はXMLのコメントを表すのに使われる.シンタックスは以下のようになる.
XMLObject["Comment"][string]
XMLObject["Comment"]["Created on 3/6/02."]
Document
XMLObjectの最も重要なものはXMLObject["Document"]である.これは以下のようなシンタックスで,ドキュメント全体のコンテナとして使われる.
XMLObject["Document"][{prolog},document tree,{epilog}].
プロローグにはXMLObject["Declaration"]と,それに続いて処理命令とDTD宣言(ともにオプション)が含まれることがある.エピローグには処理命令かコメントのどちらかが含まれる.
以下にXML宣言,コメント,1つの要素から構成される簡単なドキュメントの例を示す.
<?xml version='1.0'?> <!--this is a sample file--> <root/>
XMLObject["Document"][{
XMLObject["Declaration"]["Version""1.0"],
XMLObject["Comment"]["this is a sample file"]},
XMLElement["root",{},{}],{}]
XMLObject["Document"]の唯一のオプションは"Valid"である.このオプションはパーサによって自動的に設定される.ドキュメントのインポートの際にその妥当性が検証され,それが成功したら"Valid"->True,失敗したら"Valid"->FalseがXMLObject式に含まれる.検証されなかった場合は,オプション"Valid"は除かれる.
Doctype
XMLObject["Doctype"]式は,XMLドキュメントタイプ宣言を表すのに使われる.シンタックスは以下のようになる.
XMLObject["Doctype"][name,option->value].
<!DOCTYPE catalog PUBLIC "-//FOO//DTD catalog 1.1//EN" "www.foo.com/example/catalog.dtd" [ internal DTD stuff ]>
XMLObject["Doctype"]["catalog","Public"->"-//FOO//DTD catalog 1.1//EN", "System"->"www.foo.com/example/catalog.dtd", "InternalSubset"->"internal DTD stuff"]
XMLのDoctype宣言の詳細はW3CによるXMLの仕様書を参照のこと.
ProcessingInstruction
XMLObject["ProcessingInstruction"]はXML処理命令を表す.シンタックスは以下のようになる.
XMLObject["ProcessingInstruction"][target string, optional data string]]
処理命令では属性のようなシンタックスが用いられるのが一般的である.このような疑似属性はパースされないが,文字列として返される.以下にスタイルシートを指定する処理命令を示す.
<?xml-stylesheet href="mystyle.css" type="text/css"?>
次はこれに対応する記号的なXML式である.属性の値の周りのダブルクォートを引数の周りのダブルクォートと区別するためにエスケープしている.
XMLObject["ProcessingInstruction"]["xml-stylesheet","href=\"mystyle.css\" type=\"text/css\""]
CDATASection
XMLObject["CDATASection"]はCDATAセクションを表す.CDATAは「character data」のW3Cによる略称である.CDATAセクションはXMLドキュメントの中で,"や<等の特殊文字をエスケープしなくてもよいようにするために,文字データのラッパーとして使われる(これらの文字は,通常それぞれ"e;と<のように記さなければならない).CDATAセクションは,プログラムや数式のように多くのエスケープが必要になる文字データを囲むためにXMLで使われる.
以下にCDATAを含むXMLドキュメントの簡単なフラグメントを示す.
<![CDATA[ 5 < 7 << 2*10^123]]>
XMLObject["CDATASection"][" 5 < 7 << 2*10^123"]
デフォルトではCDATASectionオブジェクトラッパーはインポートの際に維持されず,CDATAセクションの内容だけが維持される.CDATASectionラッパーを維持するためには,変換オプションを"PreserveCDATASections"->Trueのように明示的に設定する必要がある.