5.1 XML
5.1 XML
XMLは,徐々に重要度が増してきている一般的なデータ形式です.XML形式のデータは,この形式を処理できるアプリケーションで容易に使用することができます.ですから,XML形式を選ぶと開発の手間が大幅に削減できることになります.また,XMLを使うデータ形式も増加しています.数学的・科学的見地からより重要な点は,XHTML(HTMLのXML対応バージョン),MathML(数学的情報を保存する方法),SVG(グラフィックス形式)でしょう.XMLアプリケーションのリストはhttp://www.xml.org/xml/registry.jsp でご覧ください.
Mathematica 4.2はXMLと共に使うための数多くの機能を導入しましたが,これらの機能はすべてwebMathematica 2.0でも使えます.XMLは特殊なXMLアプリケーションをサポートしており,データ交換の一般的なフォーマットとしてもwebMathematica にとって大変重宝なものです.MathML,SVG,XHTMLの使用方法についてはそれぞれのセクションで説明します.このセクションではXMLとMathematica におけるXMLの機能について概観します.また,この機能がwebMathematica でどのように役に立つのかの例題もいくつか見てみます.
5.1.1 XMLとは
このセクションではXMLについて簡単に説明します.詳細はhttp://www.w3.org/XML/ の,例えばhttp://www.w3.org/XML/1999/XML-in-10-points のような詳しい説明のページをご覧ください.
以下はXMLドキュメントのサンプルです.
<?xml version="1.0"?> <library> <book> <title>A New Kind of Science</title> <author>Stephen Wolfram</author> </book> <book> <title>The Lord of the Rings</title> <author>J.R.R. Tolkein</author> </book> </library>
上記の例のデータ形式はライブラリ用のものです.ライブラリには本(book)が収められています.それぞれの本には著者(author)と書名(title)があります.このことからも,XMLが構造化されたデータに適していることが分かるでしょう.これに加え,XMLがHTMLに少し似ていることも分かります.違いは,XMLでは特定のアプリケーションに適したタグ(「<」と「>」で囲まれている語)を導入することができるので,決められたタグに限られないことです.有効なXMLドキュメントはHTMLには適用されない規則に従わなければならないという点で,XMLのフォーマットはHTMLより厳密であると言えます.これについては次のセクション で説明します.
XMLコンプライアンス
XMLの重要な点に,ドキュメントがXMLの規則に則った整形式でなければならないということが挙げられます.このセクションではコンプライアンスの基本例を見ていきます.
XMLドキュメントにはヘッダがなければなりません.XMLドキュメントは,例えば,次のように始まらなければなりません.
<?xml version="1.0"?>
空要素は終了タグを持つか,開始タグが />で終わるかしていなければなりません.この規則から次は整形式であることが分かります.
<br/><hr/>
しかし,次は整形式ではありません.
<br><hr>
空白ではないタグに関しては,終了タグが必要です.ですから,以下は整形式です.
<p>Here is a paragraph.</p><p>Here is another.</p>
しかし次は整形式ではありません.
<p>Here is a paragraph.<p>Here is another.
5.1.2 Mathematica のXMLサポート
このセクションではXMLで使うMathematica ツールを簡単に紹介します.詳細はオンラインのドキュメントをご覧ください.重要な点のひとつはXMLが構造化されたデータを入れるのに適している点です.これはMathematica の式(Mathematica の基本的なデータタイプ)にも当てはまります.このため,XMLのデータをMathematica にインポートするのが簡単なのです.
次は簡単な例題です.
xml= "<?xml version=\"1.0\"?>\n <library>\n <book>\n <title>A New Kind of Science</title><author>Stephen Wolfram</author>\n </book>\n <book> \n <title>The Lord of the Rings</title> <author>J.R.R. Tolkein</author>\n </book>\n</library>";
このXMLはMathematica にインポートすることができます.Mathematica はインポートしたデータをSymbolic XMLで表します.Mathematica 式の性質上,Symbolic XMLはテキストXMLのMathematica ネイティブの形になります.
sym =ImportString[ xml, "XML"]
XMLObject["Document"][{XMLObject["Declaration"]["Version" -> "1.0"]}, XMLElement["library", {}, {XMLElement["book", {}, {XMLElement["title", {}, {"A New Kind of Science"}], XMLElement["author", {}, {"Stephen Wolfram"}]}], XMLElement["book", {}, {XMLElement["title", {}, {"The Lord of the Rings"}], XMLElement["author", {}, {"J.R.R. Tolkein"}]}]}], {}]
Mathematica の基本的なプログラミング機能を使ってSymbolic XMLを処理することができます.例えば,著者(author)を全部抽出することができます.
Cases[sym, XMLElement[ "author", a_, {d_}] -> d, Infinity]
{"Stephen Wolfram", "J.R.R. Tolkein"}
newSym = sym/.XMLElement[ t_, a_, {d_}] -> XMLElement[t, a, {ToLowerCase[d]}]
XMLObject["Document"][{XMLObject["Declaration"]["Version" -> "1.0"]}, XMLElement["library", {}, {XMLElement["book", {}, {XMLElement["title", {}, {"a new kind of science"}], XMLElement["author", {}, {"stephen wolfram"}]}], XMLElement["book", {}, {XMLElement["title", {}, {"the lord of the rings"}], XMLElement["author", {}, {"j.r.r. tolkein"}]}]}], {}]
次に,もとの入力に修正を加えて新たなXML形式を生成します.
ExportString[newSym, "XML"]
"<?xml version='1.0'?>\n<library>\n <book>\n <title>a new kind of science</title>\n <author>stephen wolfram</author>\n </book>\n <book>\n <title>the lord of the rings</title>\n <author>j.r.r. tolkein</author>\n </book>\n</library>"
もちろんこの種の変形は他の方法でも行えます.例えば,XSLTスタイルシート技術を使うことができます.しかし,XSLTスタイルシートを設定して変形を行うようにするのはオーバーヘッドになります.統一されたプログラミング原理を持つMathematica を使う方が,早く簡単にタスクを行えることがよくあります.
Mathematica のXMLツールにはこの他にも,例えば属性,実体,名前空間,認証,CDATAの使い方等多くの特徴があります.詳しくはMathematica のドキュメントをご覧ください.
5.1.3 webMathematica XMLアプリケーション
webMathematica アプリケーションの多くはすぐにブラウザで使うことのできるHTMLを生成します.しかし,webMathematica サイトからの出力はブラウザに送られないこともあります.アプリケーションが何らかのデータを読み取りその後で更に処理が行われることもあるのです.このセクションではこのような処理がどのように行われるのかを見てみます.
この例題のソースはwebMathematica/Examples/XML/Phone.jsp にあります.この例ではXMLファイルwebMathematica/Examples/XML/phone.xml も使います.前述 のようにwebMathematica をインストールするとhttp://localhost:8080/webMathematica/Examples/XML/Phone.jsp でこのJSPに接続することができます(ご自分のサーバに接続するURLはこれとは多少異なる場合もあります).
まず,XMLのデータを見てみます.
<?xml version="1.0"?> <EmployeeList> <Person Name="Tom Jones" Email="tomj" Phone="235-1231" /> <Person Name="Janet Rogers" Email="jrogers" Phone="235-1129" /> <Person Name="Bob Norris" Email="bobn" Phone="235-1237" /> <Person Name="Kit Smithers" Email="ksmit" Phone="235-0729" /> <Person Name="Jamie Lemay" Email="jlemay" Phone="235-6393" /> </EmployeeList>
Phone.jsp の内容は以下の通りです.
<%@ page language="java" %> <%@ taglib uri="/webMathematica-taglib" prefix="msp" %> <msp:evaluate> xml = Import[ ToFileName[ MSPPageDirectory[], "phone.xml"], "XML"] ; If[ MSPValueQ[ $$name], patt = "*" <> $$name <> "*"; xml = DeleteCases[xml, XMLElement[ "Person", {___, "Name"->n_/;!StringMatchQ[n, patt], ___}, _ ], Infinity]] ; MSPReturn[ ExportString[ xml, "XML"], "text/xml"] </msp:evaluate>
この例題では,最初にXMLファイルをMathematica にインポートします.XMLのデータがPhone.jsp と同じディレクトリにあるのでコマンドMSPPageDirectory が使われています.次にパラメータname が送られたがどうかが検証されます.送られていた場合には,この名前に一致しないXML要素を消去するためにこれが使われます.http://localhost:8080/webMathematica/Examples/XML/Phone.jsp?name=T 等のURLでこのパラメータの操作を見ることができます(ご自分のサーバに接続するURLはこれとは多少異なる場合もあります).
もちろんこのXMLデータをさらに処理したいこともあるでしょう.XMLを認識するシステムがあるなら,これは極めて簡単に行えます.無論,XMLを認識するアプリケーションで便利なもののひとつはMathematica です.例えば次でwebMathematica サイトを呼び出して情報を取り出します.
XML`Parser`XMLGet["http://localhost:8080/webMathematica/Examples/XML/Phone.jsp"]
XMLObject["Document"][{XMLObject["Declaration"]["Version" -> "1.0"]}, XMLElement["EmployeeList", {}, {XMLElement["Person", {"Name" -> "Tom Jones", "Email" -> "tomj", "Phone" -> "235-1231"}, {}], XMLElement["Person", {"Name" -> "Janet Rogers", "Email" -> "jrogers", "Phone" -> "235-1129"}, {}], XMLElement["Person", {"Name" -> "Bob Norris", "Email" -> "bobn", "Phone" -> "235-1237"}, {}]}], {}]
Mathematica のプログラムでこれを使うこともできます.
Contact[query_String]:= Cases[XML`Parser`XMLGet["http://localhost:8080/webMathematica/Examples/XML/Phone.jsp?name="<>query], XMLElement["Person", x_List, {}] :> x, Infinity]
Contact[ "Tom"]
{{"Name" -> "Tom Jones", "Email" -> "tomj", "Phone" -> "235-1231"}}
もちろん,クライアントがVisual Basic,Python,JavaのようなMathematica 以外のシステムで書かれていても大丈夫です.