Download presentation
Presentation is loading. Please wait.
1
XJ: XML Enhancements to Java の紹介
POPL Meeting 2005/11/30 細谷研究室 稲葉一浩
2
XJ とは? Java ベースのプログラミング言語 XMLに関する3つの拡張 Java 1.4 プログラムはそのまま通る
標準的なJavaのclassファイルを生成 XMLに関する3つの拡張 XML Schema を Javaの型として import XML リテラル XPath 式
3
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) ); }
4
参考資料 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
5
本日の発表内容 動機 XJの機能紹介 静的解析 In-place updates 従来のXML処理の欠点 XJのアプローチ 関連研究との比較
XML Schemaのimport XMLリテラル XPath式 静的解析 In-place updates
6
従来の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);
7
従来のXML処理 (2) XSLT, XQuery 等のXML専用システム
全体のアプリケーション開発言語(Java等) とXML処理部(XSLT等)との橋渡しに難 XPath式やXQuery式を文字列で渡すので、実行時に構文解析から始める必要 XMLの内部表現の互換性が規定されていないので、無駄な変換が発生 アプリケーション中でのXMLの使われ方に基づく処理の最適化も不可能
8
XJのアプローチ XMLをJava言語の第一級の要素とする XMLを扱うプログラムの記述が簡単
コンパイラによる(XMLやXPathの) 型検査 コンパイラによる、型情報に基づく最適化
9
関連研究 (1) E4X ECMAScript(JavaScript) + XML
XPath風のアクセス式 静的型検査はない Mozilla, Macromedia Flash 等に実装
10
関連研究(1) E4Xの例 var x = <addressbook> <person>
<name>太郎</name> <address>どこか</address> <age>ひみつ</age> </person> ... </addressbook> print( x.person.(name.find(“郎”)!=-1).address )
11
関連研究 (2) Xtatic C# + XML XMLリテラル Regular Expression Types
Regular Expression Patterns
12
関連研究(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 </> ]]: ... }
13
関連研究 (3) Cω C# + XML + SQL XMLリテラル Regular Expression ぽい型システム
XPath風,SQL風のアクセス 独自のXML型システムとアクセス方式に基づいており、 XML Schema や XPath と言った existing standard を直接扱えない
14
関連研究(3) Cωの例 struct addressbook { struct { string name;
string address; int? age; }* person; } addressbook ad = <addressbook>...</addressbook>; name* ns = ad.person[it.age < 20].name;
15
XJの機能 : スキーマのimport 復習 : スキーマ言語 XML文書の木構造を定義する言語 DTD XML Schema
RelaxNG ...
16
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>
17
XJの機能 :スキーマのimport Addr.class や Addr.java が存在しなければ、Addr.xsd から型を読み込み
import Addr.addressbook.person; import Addr.addressbook.person.*; Addr.class や Addr.java が存在しなければ、Addr.xsd から型を読み込み
18
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'
19
XJの機能 :スキーマのimport
20
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>);
21
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 |];
22
XJの機能 : XPath式の空判定 スキーマと照合すると結果が必ず空列となるXPathについては、コンパイル時にエラーとする
Rationale: XPathの意味論では、間違ったクエリは実行時エラーにならず単に空列を返すのみ。コンパイル時検出が無いと非常にバグを見つけにくい address ad = a[| person[name=$n]/adress |]; ERROR: XPath expression returns no results
23
XJの機能 : XPathの静的解析 型付け 空判定 正規化・最適化 XPath式の型をできるだけconcreteにしたい
XAEL Library : abstract interpretation (unpublished) 空判定 空列を返すXPathをエラーにしたい 正規化・最適化 探索なしで簡単にたどれるXPathは、XPathエンジンに投げず直接木をなぞりたい
24
XDAG表現 //Y[/U]//W[ancestor::Z/V]
25
XJの機能(予定) : Updates Javaは破壊的代入を持つ言語なので、XJでも代入によるXMLの更新が可能なほうが、Javaプログラマにとって直感的 代入によるUpdateの際の注意点 DagやCycleが発生してはならない 型チェック
26
XJの機能(予定) : Updates Dag, Cycle の回避 型の保証 Runtimeにチェック Simple Update
XPath式を左辺値とする代入 XPath式の型は静的解析されている Structural Update XMLElement.insertAfter, insertBefore, detach 基本的にRuntimeに型チェック a[| person/age |] +:= 1;
27
まとめ XJ: XML Enhancements to Java XML Schema の import XMLリテラル XPath式
静的解析 In-place updates
Similar presentations
© 2024 slidesplayer.net Inc.
All rights reserved.