Document

XJ: XML Enhancements to Java
の紹介
POPL Meeting 2005/11/30
細谷研究室 稲葉一浩
[email protected]
XJ とは?

Java ベースのプログラミング言語



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 Schemabased Revalidation of XML”, EDBT2004
C.Barton et al., “Streaming XPath with
Forward and Backward Axes”, ICDE2003
本日の発表内容

動機




XJの機能紹介





従来の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




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
import Addr.*;
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式を左辺値とする代入


a[| person/age |] +:= 1;
XPath式の型は静的解析されている
Structural Update

XMLElement.insertAfter, insertBefore, detach

基本的にRuntimeに型チェック
まとめ

XJ: XML Enhancements to Java



XML Schema の import
XMLリテラル
XPath式


静的解析
In-place updates