Wolfram言語におけるXMLの表現

XMLとWolfram言語

Wolfram言語では,広範囲に渡ってXMLがサポートされている.XMLとは,W3C (World Wide Web Consortium)によって開発された,構造化ドキュメントおよびデータを表現するためのマークアップ言語である.Wolfram言語のXML機能を使うと,以下のようなことが可能である.

ネイティブXML形式

Wolfram言語はMathMLSVGExpressionMLJVXX3DVRMLXHTML等,多くの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言語にインポートする.

Import["data.xml","XML"]

結果は記号的なML式 expr1 となる.この式は標準のWolfram言語コマンドを使って操作できる.変換の最終結果は別の記号的なXML式 expr2 となる.

expr1->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 >

は,記号的なXMLでは以下のような表現になる.

XMLElement[element,{attribute->value},{data}]

XMLElement[]式は3つの引数を取る.

<book type='novel'>Moby Dick</book>

これは記号的なXMLでは以下のようになる.

XMLElement["book",{"type"->"novel"},{"Moby Dick"}]

次はより複雑なXML式である.複数レベルにネストしている.

<book type='novel'> <title>Moby Dick</title> <author born='1819' died='1891'> <name> <first>Herman</first> <last>Melville</last> </name> </author> </book>

これに対応する記号的なXMLは以下のようになる.

名前空間の処理

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>

これに対応する記号的なXML式は以下のようになる.

html要素を表しているXMLElement式が複雑な構造を取っていることに注意されたい.第2引数は次のようになっている.

{{"http://www.w3.org/2000/xmlns/","xmlns"}->"http://www.w3.org/1999/xhtml"}

この文は

XMLElement[element,{{xmlns_uri,"xmlns"}-> namespace_uri},{data}].

ここで xmlns_urixmlns属性の名前空間に関連付けられている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>

これに対応する記号的なXML式は次のようになる.

ここで注意しなければならない点が2点ある.

他のオブジェクトの表現

XMLObject式はXMLドキュメントの要素以外のもの(コメント,処理命令,宣言等)のコンテナとして使われる.これはドキュメント全体のコンテナとしても使用されます.この構造のシンタックスはXMLObject[object][data]という形である.ここで object は表されるオブジェクトのタイプを表し,data はオブジェクトの詳細を指定するものである.第1引数として指定できるものには6種類のタイプのオブジェクトがあり,各オブジェクトタイプがXMLドキュメントの特定のタイプのコンストラクトに対応する.

Declaration

XMLObject["Declaration"]式はXML宣言を表す.XML宣言は通常XMLドキュメントの冒頭に置かれる.シンタックスは以下のようになる.

XMLObject["Declaration"]["Version"->"1.0", option->value]

これには2つのオプションがある.

<?xml version="1.0" encoding="ascii" standalone="yes"?>

これに対応する記号的なXML式は次のようになる.

Comment

XMLObject["Comment"]はXMLのコメントを表すのに使われる.シンタックスは以下のようになる.

XMLObject["Comment"][string]

次はXMLの例である.

<!-- Created on 3/6/02. -->

これは記号的なXML式では次のようになる.

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/>

これに対応する記号的なXML式は,次のようになる.

XMLObject["Document"][{
XMLObject["Declaration"]["Version""1.0"],
XMLObject["Comment"]["this is a sample file"]},
XMLElement["root",{},{}],{}]

XMLObject["Document"]の唯一のオプションは"Valid"である.このオプションはパーサによって自動的に設定される.ドキュメントのインポートの際にその妥当性が検証され,それが成功したら"Valid"->True,失敗したら"Valid"->FalseXMLObject式に含まれる.検証されなかった場合は,オプション"Valid"は除かれる.

Doctype

XMLObject["Doctype"]式は,XMLドキュメントタイプ宣言を表すのに使われる.シンタックスは以下のようになる.

XMLObject["Doctype"][name,option->value].

これには3つのオプションが使える.

<!DOCTYPE catalog PUBLIC "-//FOO//DTD catalog 1.1//EN" "www.foo.com/example/catalog.dtd" [ internal DTD stuff ]>

これに対応する記号的なXML式は,次のようになる.

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ドキュメントの中で,"<等の特殊文字をエスケープしなくてもよいようにするために,文字データのラッパーとして使われる(これらの文字は,通常それぞれ&quote;&lt;のように記さなければならない).CDATAセクションは,プログラムや数式のように多くのエスケープが必要になる文字データを囲むためにXMLで使われる.

以下にCDATAを含むXMLドキュメントの簡単なフラグメントを示す.

<![CDATA[ 5 < 7 << 2*10^123]]>

これに対応する記号的なXML式は,次のようになる.

XMLObject["CDATASection"][" 5 < 7 << 2*10^123"]

デフォルトではCDATASectionオブジェクトラッパーはインポートの際に維持されず,CDATAセクションの内容だけが維持される.CDATASectionラッパーを維持するためには,変換オプションを"PreserveCDATASections"->Trueのように明示的に設定する必要がある.