XJ: XML Enhancements to Java の紹介 POPL Meeting 2005/11/30 細谷研究室 稲葉一浩 kinaba@is.s.u-tokyo.ac.jp
XJ とは? Java ベースのプログラミング言語 XMLに関する3つの拡張 Java 1.4 プログラムはそのまま通る 標準的なJavaのclassファイルを生成 XMLに関する3つの拡張 XML Schema を Javaの型として import XML リテラル XPath 式
Hello World import com.ibm.xj.io.*; public class XJSample { public static void main( String[] args ) { XMLElement e = new XMLElement( <messagelist> <msg>Hello</msg> <msg>World</msg> </messagelist> ); Sequence<XMLElement> ms = e[| .//msg |]; XMLOutputStream out = new XMLOutputStream(System.out); out.println( ms.get(0) ); out.println( ms.get(1) ); }
参考資料 IBM Research – XJ http://www.research.ibm.com/xj/ M.Harren et al., “XJ: Facilitating XML Processing in Java”, WWW2005 M.Raghavachari et al., “Efficient Schema-based Revalidation of XML”, EDBT2004 C.Barton et al., “Streaming XPath with Forward and Backward Axes”, ICDE2003
本日の発表内容 動機 XJの機能紹介 静的解析 In-place updates 従来のXML処理の欠点 XJのアプローチ 関連研究との比較 XML Schemaのimport XMLリテラル XPath式 静的解析 In-place updates
従来のXML処理 (1) SAX, DOM 等の低レベルAPI (特にXML出力に関して)記述が非常に面倒 静的な型検査ができない root = doc.createElement(“messagelist”); m1 = doc.createElement(“msg”); m2 = doc.createElement(“msg”); m1.appendChild( doc.createTextNode(“Hello”) ); m2.appendChild( doc.createTextNode(“World”) ); root.appendChild(m1); root.appendChild(m2); seq = doc.getElementsByTagName(“msg”); seq.item(0);
従来のXML処理 (2) XSLT, XQuery 等のXML専用システム 全体のアプリケーション開発言語(Java等) とXML処理部(XSLT等)との橋渡しに難 XPath式やXQuery式を文字列で渡すので、実行時に構文解析から始める必要 XMLの内部表現の互換性が規定されていないので、無駄な変換が発生 アプリケーション中でのXMLの使われ方に基づく処理の最適化も不可能
XJのアプローチ XMLをJava言語の第一級の要素とする XMLを扱うプログラムの記述が簡単 コンパイラによる(XMLやXPathの) 型検査 コンパイラによる、型情報に基づく最適化
関連研究 (1) E4X ECMAScript(JavaScript) + XML XPath風のアクセス式 静的型検査はない Mozilla, Macromedia Flash 等に実装
関連研究(1) E4Xの例 var x = <addressbook> <person> <name>太郎</name> <address>どこか</address> <age>ひみつ</age> </person> ... </addressbook> print( x.person.(name.find(“郎”)!=-1).address )
関連研究 (2) Xtatic C# + XML XMLリテラル Regular Expression Types Regular Expression Patterns
関連研究(2) Xtaticの例 regtype Name [[<name>PCDATA</>]] regtype Person [[<person> Name Tel </>]] regtype AddrBook [[<addressbook> Person* </>]] [[Person*]] ps = [[ <person> <name>ABC</name> <address>DEF</address> </person> ... ]] match(ps) { case[[ <person> <name>any</> n, any </> ]]: ... }
関連研究 (3) Cω C# + XML + SQL XMLリテラル Regular Expression ぽい型システム XPath風,SQL風のアクセス 独自のXML型システムとアクセス方式に基づいており、 XML Schema や XPath と言った existing standard を直接扱えない
関連研究(3) Cωの例 struct addressbook { struct { string name; string address; int? age; }* person; } addressbook ad = <addressbook>...</addressbook>; name* ns = ad.person[it.age < 20].name;
XJの機能 : スキーマのimport 復習 : スキーマ言語 XML文書の木構造を定義する言語 DTD XML Schema RelaxNG ...
XJの機能 : スキーマのimport 復習 : XML Schema <schema ...> <complexType name=“record”> <sequence> <element name=“name” type=“string”/> <element name=“address” type=“string”/> <element name=“age” type=“integer”/> </sequence> </complexType> <element name=“addressbook”> <complexType><sequence> <element name=“person” type=“record” minOccurs=“0” maxOccurs=“unbounded”/> </sequence></complexType> </element> </schema>
XJの機能 :スキーマのimport Addr.class や Addr.java が存在しなければ、Addr.xsd から型を読み込み import Addr.addressbook.person; import Addr.addressbook.person.*; Addr.class や Addr.java が存在しなければ、Addr.xsd から型を読み込み
XJの機能 :スキーマのimport person p = new person( <person> <name>Inaba</name> <address>Tokyo</address> <age>23</age> </person> ); person p = new person( <person> <name>Inaba</name> <age>23</age> </person> ); ERROR: Invalid particle content for element 'Addr.addressbook.person'
XJの機能 :スキーマのimport
XJの機能 : XMLリテラル XMLElementのコンストラクタ引数に、 XMLをそのまま書き下すことが可能 Javaの値を埋め込みたいときは { ... } ※ 試したらコンパイラからNullPointerExceptionが… int a = 10; person p = new person( <person> <name>Inaba</name> <address>Tokyo</address> <age>{a*a}</age> </person> ); addressbook adr = new addressbook(<addressbook>{p}</addressbook>);
XJの機能 : XPath式 XJでは、ノードから関連する別のノードへのアクセスは、全て XPath で行う addressbook a = new addressbook( ... ); Sequence<person> children = a[| * |]; Sequence<name> tw = a[| person[age<20]/name |]; String name = “Inaba”; address ad = a[| person[name=$n]/address |];
XJの機能 : XPath式の空判定 スキーマと照合すると結果が必ず空列となるXPathについては、コンパイル時にエラーとする Rationale: XPathの意味論では、間違ったクエリは実行時エラーにならず単に空列を返すのみ。コンパイル時検出が無いと非常にバグを見つけにくい address ad = a[| person[name=$n]/adress |]; ERROR: XPath expression returns no results
XJの機能 : XPathの静的解析 型付け 空判定 正規化・最適化 XPath式の型をできるだけconcreteにしたい XAEL Library : abstract interpretation (unpublished) 空判定 空列を返すXPathをエラーにしたい 正規化・最適化 探索なしで簡単にたどれるXPathは、XPathエンジンに投げず直接木をなぞりたい
XDAG表現 //Y[/U]//W[ancestor::Z/V]
XJの機能(予定) : Updates Javaは破壊的代入を持つ言語なので、XJでも代入によるXMLの更新が可能なほうが、Javaプログラマにとって直感的 代入によるUpdateの際の注意点 DagやCycleが発生してはならない 型チェック
XJの機能(予定) : Updates Dag, Cycle の回避 型の保証 Runtimeにチェック Simple Update XPath式を左辺値とする代入 XPath式の型は静的解析されている Structural Update XMLElement.insertAfter, insertBefore, detach 基本的にRuntimeに型チェック a[| person/age |] +:= 1;
まとめ XJ: XML Enhancements to Java XML Schema の import XMLリテラル XPath式 静的解析 In-place updates