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
© Copyright 2024 ExpyDoc