Mathematica におけるXMLの表現

XMLとMathematica

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

  • 任意のXMLドキュメントを Mathematica 式として Mathematica にインポートできる.
  • Mathematica の高度なプログラミングおよび記号操作能力を使って,XMLドキュメントの内容を解析したり,その構造を変換したりすることができる.
  • 結果の式をXMLにエキスポートし,他のユーザやアプリケーションとドキュメントを共有することが可能である.
    • Web上での数式表記標準であるMathML式のインポート,エキスポート,評価が行える.

    このような機能により,Mathematica はXMLドキュメントを作成し処理する強力な開発環境となる.また,Mathematica と他のXMLアプリケーション間,またはノートブックと他のXMLドキュメント形式の間での完全な相互運用が可能となる.

ネイティブXML形式

MathematicaMathMLSVGExpressionMLJVXX3DVRMLXHTML等,多くのXML形式を組込みサポートしている.これらのいずれかの形式を使っているドキュメントをインポートすると,特定のタイプの Mathematica 式に自動的に変換される.ExpressionMLファイルはセル式としてインポートされ,MathMLファイルはボックス式として返される.

MathML

MathMLはW3Cによって数式の構造と意味を記述するために開発れたXML形式である.これはWeb上で数式表現を表示するための標準である.Mathematica はMathMLの生成と操作や,MathMLと Mathematica で数式を表現するために内部的に使われている式との間の変換の他,MathMLのインポートとエキスポートもサポートしている.

このようなMathMLの機能により,Mathematica はMathMLの内容を書き,編集するための優れた環境となる.例えば,Mathematica のパワフルなタイプセットシステムを使って適切にフォーマットされた式を作成し,その式をMathML形式でHTMLドキュメントにペーストすると,Web上で表示できるようになる.他のアプリケーションのMathML式をインポートし,Mathematica で評価することも可能である.

SVG

SVG (Scalable Vector Graphics)は2Dグラフィックスの表現のためにW3Cが開発したXML形式である.SVG画像は損失なくサイズ変更でき,また,通常JPEGやGIF画像と比較して格段にファイルサイズが小さくなる.SVGファイルは,動的かつインタラクティブなグラフィックスを生成するために,スクリプト言語を使って操作することができる.Mathematica 4.2以降を使うと,ノートブック中のどのグラフィックスも,直接SVG形式にエキスポートできる.

ExpressionML

ExpressionMLはどのような Mathematica 式でもXML形式で表現することができる.

記号的なXML

記号的なXMLとは

記号的なXMLはXMLドキュメントを表現するために Mathematica で使われる形式である.XMLを記号的なXMLに変換すると,XMLドキュメントはその構造を保ったまま Mathematica 式に変換される.XMLドキュメントと Mathematica 式は木構造を取っているため,どちらからどちらへの変換にも自然なマッピングができる.その後 Mathematica プログラミングの標準的手法を使って記号的なXML式を操作することもできる.

XMLデータは,標準のImportまたはImportString関数を使って Mathematica にインポートできる.オプションを設定すると,ホワイトスペースの処理方法や実体を認識するかどうか,またはDTDに対して妥当性を検証するかどうか等,インポート処理におけるさまざまな詳細も制御できる.

次のコマンドはXMLデータを Mathematica にインポートする.

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

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

最後に,標準Export関数を使って結果をXMLファイルにエキスポートできる.

Export["newdata.xml", expr2, "XML"]

オプションを使うとエキスポート後のXMLのフォーマット等,エキスポート処理におけるさまざまな詳細が制御できる.

記号的なXMLと Mathematica プログラミングを組み合わせることで,XSLT変換やJava等の低レベルプログラミング言語で使われるSAXやDOM API等,XMLドキュメントの操作のためのその他の方法を代替することができるので便利である.Mathematica でもこれらと同程度の柔軟で制御性に富んだXMLドキュメントの処理が可能となる.Mathematica の記号操作と数値計算の高度なサポートを,その他の方法では難しい,あるいは不可能な非常に複雑で高度な変換に利用できる.

例えば,パターンマッチング技術を使ってXMLドキュメントの特定の部分を抽出し,データに対して数値計算を行い,可視化のために結果を3Dグラフィックスに変換できる.また,あるタイプのXMLアプリケーションをその他のものに変換するための定義もできます.例えば,DocBookドキュメントを記号的なXMLとしてインポートし,要素名を他の要素名に変換する適切な変換規則を定義して,XHTML形式に変換することもできる.記号的なXMLの便利な具体的応用例はXMLの変換を参照されたい.

記号的なXMLのサポートは,ExpressionML,MathMLとうまく統合されている.ExpressionMLとMathMLを記号的なXMLとしてインポートしたり,ExpressionMLを式として,MathMLをタイプセットボックス式としてインポートしたりすることができる.文字列,ボックス,式と,MathML,記号的なXML間の変換を素早く簡単にするためのカーネル関数は数多く存在する.

直接Javaを使ってXMLドキュメントを操作したい場合は,J/Link アドオンパッケージを使って行える.このパッケージは Mathematica を完全にJavaと統合し,Mathematica からJavaのコマンド,あるいはJavaプログラムから Mathematica カーネル関数が呼び出せるようになる.従って Mathematica の計算能力とJavaの低レベルプログラミング機能とクラスの両方にアクセスできるようになり,必要に応じてこの2つを組み合せることも可能となる.

要素の表現

XMLドキュメントの各要素は,記号的なXMLではXMLElementオブジェクトに相当する.次のような形式のXML式

< element attribute =' value '> data </ element >

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

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

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

  • 第1引数は要素名を指定する.
  • 第2引数は要素の属性を規則のリスト(ない場合もある)として指定する.各規則は という形で1つの属性を指定する.
    • 第3引数は要素に含まれる実際のデータを指定するものである.これは文字列としての実際の文字データ,表現される要素の子要素,またはその両方となる.各子要素は各々のXMLElement[]式で表現される.もとのXML式のネスト構造を反映するのに必要なレベルまで,複数のXMLElement[]式をネストすることもできる.

    XMLドキュメントに含まれる文字データ,要素名,属性名は,記号的なXMLでは文字列として表される.これは多くの新しいシンボルが Mathematica に導入されて名前の重複が起るのを防ぐためである.

    以下は簡単なXMLのフラグメントである.

<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引数は次のようになっている.

この文は

  • XMLの仕様で要求されているように,URI (Universal Resource Identifier) http://www.w3.org/2000/xmlnsで定義される名前空間で属性xmlnsを識別する.
    • xmlns属性の値をURI http://www.w3.org/1999/xhtmlに設定することにより,デフォルトの名前空間を定義する.

    一般に,ある要素に対してデフォルトの名前空間を宣言すると,対応するXMLElement構造のシンタックスは次のようになる.

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

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

  • 最上位のmath要素に対するXMLElement構造の最初の属性はとなる.これはMathML名前空間と接頭辞を関連付ける.
  • 各MathML要素に対するXMLElement構造はXMLElement[{uri, element}, {}, {data}]という形になる.ここで,uri はMathML名前空間を識別するためのものである.これは,名前空間接頭辞が付加された形の要素名に対応する記号的なXMLでの記述である.

他のオブジェクトの表現

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

  • Declaration
  • Comment
  • Document
  • Doctype
  • ProcessingInstruction
  • CDATASection

Declaration

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

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

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

  • —ドキュメントが外部DTDを参照しているときは値を取り,それ以外の場合はを取る.
    • —ドキュメントに使われる文字コードを指定します.すべてのコードがエキスポートできる訳ではない.Mathematica がエキスポートできないコードが指定された場合はエラーメッセージが生じ,ドキュメントのコードが変更される.

    一般的なXML宣言を以下に示す.

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

Doctype

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

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

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

  • —ローカルファイルシステムのDTDを,相対パス名またはURIとして指定するときに使う
  • —公にDTDの認識に用いられる標準化された名前の指定に使う
    • —値は内部DTDサブセットのデータを含む文字列で,内部DTDサブセットを指定するときに使う

    以下に形式化されたパブリック識別子の名前と内部DTDサブセットに基づくDTDの特定の場所の両方を含むDoctypeの宣言を示す.

<!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"]

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

New to Mathematica? Find your learning path »
Have a question? Ask support »