Introduction to XML
DM 01k1024 諸星 宏行
XMLとは何か?

XMLはインターネットのための汎用的なデータ記述言語
である

データをテキスト形式で記述できるので、異なるプラット
ホームやアプリケーション間でもデータ交換ができる

自由にタグ名や使い方を定義でき、どんなデータでも記
述することができる

Webサービス、データベース、B to B、Webパブリッシン
グ、EAIなど様々な場面で使われている
XML文書がサポートする仕様

XML1.0・・・XMLの書き方、文法など

XML名前空間・・・XMLのタグを書き分ける為の仕様

XLink, XPointer, XPath・・・XMLからXMLへのハイパーリンクなどの為の
仕様

DTD, XML Schema・・・XML文書の型を決めるためのスキーマ言語

XSLT・・・XML文書を変換するためのスクリプト言語仕様

DOM・・・XML文書をツリー構造として解釈し、アクセスするためのAPI仕様

SAX・・・XML文書を先頭から順に読み込んでいき、そこで発生したイベント
を伝えるためのAPI仕様
XMLの処理の流れ
XML
XML Parser
Application
DTD
XML Schema
※ パーサはスキーマにしたがって、
XMLを解析(ツリー)し、情報を取得する。
XMLの構造

XML文書は、XML宣言、DTD(文書型定義)、本体、の3
つの部分に分かれている

XML宣言(XML declaration)


DTD


先頭にあり、XMLのバージョンなどを定義
どんな要素がどのように記述されるのか、
といった構造を定義(任意)
XML宣言
DTD(文書型定義)
本体
本体(XML instance)

開始タグ、終了タグの入れ子構造で表現し、
タグは自由に名前を付けることで意味をもたせることが出来る
book.xml
XMLの構造

XMLのデータは全体的にツリー構造になっている
<Parent>
Parent
<Brother/>
<Me>
Brother
Me
<Boy>First Child</Boy>
<Girl>Second Child</Girl>
Boy
Girl
</Me>
</Parent>
First Child Second Child
XMLの構造(名前空間)


同じXMLデータに複数のボキャブラリを混在させても、要素・属性
の名前が衝突しないようにするために定めた規格
決して重複しない識別子としてURIを使い、コロン“:”を挟んでタグ
名と連結させる
<?xml version="1.0" ?>
<nt:book xmlns:nt ="http://www.deitel.com/books">
<nt:title>Java How to Program</nt:title>
<nt:author>Barbara, Harvey, Paul, Abbey Deitel</nt:author>
<c:chapter xmlns:c=" http://www.deitel.com/books/chapter">
<c:number>6</c:number>
<c:page>265</c:page>
<c:title>Object base programming</c:title>
<c:required>Yes</c: required>
</c:chapter>
</nt:book>
XMLの構造(DTD)

要素型宣言(element type declaration)




属性リスト宣言(attribute-list declaration)


<!ATTLIST title id ID #REQUIRED >
エンティティ宣言(entity declaration)


<!DOCTYPE manual [
<!ELEMENT manual (title, preface, body, index) >
<!ELEMENT title (#PCDATA) >
<!ENTITY w3c "World Wide Web Consortium">
記法宣言(notation declaration)

<!NOTATION CGM PUBLIC "ISO 8632/4//NOTATION clear text
encoding//EN" "http://www.utj.co.jp/……">
XMLの構造(XML Schema)



XML SchemaはDTDにかわる次世代のスキーマ言語である
XML SchemaはDTDと違い、XML文書
ルート要素は“schema”
<?xml version="1.0"?>
customer.xml
<xsd:schema
xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<xsd:element name="customer">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="name" type="xsd:string"/>
<xsd:element name="address" type="xsd:string" />
</xsd:sequence>
<xsd:attribute name="id" type="xsd:string"/>
</xsd:complexType>
</xsd:element>
XMLの構造(XML Schema)
<?xml version="1.0"?>
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<xsd:element name="customer">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="name" type="xsd:string"/>
<xsd:element ref="address"/>
</xsd:sequence>
</xsd:complexType>
customer2.xml
XML Schema(not ref).xsd
</xsd:element>
<xsd:element name="address">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="prefecture" type="xsd:string"/>
<xsd:element name="city" type="xsd:string" />
<xsd:element name="street" type="xsd:string" />
</xsd:sequence>
</xsd:complexType>
</xsd:element>
</xsd:schema>
XMLの操作(DOM)












ツリーベースのAPI
プロセッサがXMLデータを一気に読み込んで構文解析し、メモリ上
にツリーを展開する
ツリーにアプリケーションがインターフェースを使ってランダムにアク
セスして、要素を変更したり削除したりする
getFirstChild()…最初の子の取得
Document
getLastChild()…末の子の取得
Parent
getNextSibling()…弟の取得
getPreviousSibling()…兄の取得
getChildNodes()…子供のリストの取得
Sibling Current
createElement()…要素の作成
appendChild()…要素を最後尾に追加、
Child 1
removeChild()…要素の削除
getElementsByTagName()…指定した名前の要素のリストを取得
Node
Child 2
XMLの操作(DOM)

DOMを使ってXML文書を単純に表示するだけのプログラム
ReadXML.java
// XML documentの最上位要素の取得
Node firstNode = document.getDocumentElement();
getNode( firstNode );
Parent
Child Child Child
getNextSibling()
// getNodeメソッド
public static void getNode( Node node ){
if( node.getNodeType() = = Node.TEXT_NODE ) // → テキストノードなら出力
else if( node.getNodeType() = = Node.ELEMENT_NODE )
// → 要素ノードなら属性も含めてStart tagを出力
for( childNode = node.getFirstChild(); childNode != null;
childNode = childNode.getNextSibling() )
// next brother
getNode( childNode );
System.out.print( "</" + node.getNodeName() + ">" ); // End tagの出力
}
XMLの操作(SAX)










イベントベースのAPI
先頭から順にXMLデータを読み込んでいき、“要素の開始”や“要
素の終わり”といったイベントを生成、その都度アプリケーションに
通知する。
アプリケーションはそれらのイベントを受け取ったときの処理を定義
しておき、イベントを受け取ったときに呼び出されて処理を行う。
文書の開始 (startDocument)、文書の終了 (endDocument)
要素の開始 (startElement)、要素の終了 (endElement)
名前空間の開始 (startPrefixMapping)、名前空間の終了 (endPrefixMapping)
文字列 (characters)
処理命令 (processingInstruction)
Locatorオブジェクトの受け渡し(setDocumentLocator)
エンティティのスキップ (skippedEntity)
XMLの操作(SAX)

DOMを使ってXML文書を単純に表示するだけのプログラム
PrintXML.java
<?xml version=”1.0”?>
<parent>
<brother/>
<me>
<girl>First child</girl>
<boy>Second child</boy>
</me>
</parent>
public void startDocument() throws SAXException{
System.out.println( "<?xml version = \"1.0\"?>" );
}
public void startElement(String eleName) throws SAXException{
System.out.print( "<" + eleName + “>” );
}
public void endElement(String eleName) throws SAXException{
System.out.println( "</" + eleName + ">" );
}
public void endDocument() throws SAXException {
System.out.println( "---[ document end ]---" );
}
サンプルプログラム

ブラウザから入力したデータをもとにJSP、DOMを使って
XMLデータを作成、削除、データ入力をするプログラム
(店舗の売上データをXMLに記述して管理するサンプルプログラ
ム)






MakeFile.jsp ・・・ XML文書の作成ページ
DataInput.jsp ・・・ データの入力ページ
DeleteData.jsp ・・・ データの削除ページ
FileDelete.jsp ・・・ ファイルの削除ページ
DownLoad.jsp ・・・ XML文書のダウンロードページ
TableShow.jsp ・・・ XML文書の内容を表示するページ
ダウンロード
インストール

Java Web Services Developer Packをダウンロードする
http://java.sun.com/webservices/downloads/webservicespack.html
から“Download”を選択し、ダウンロード後、インストールを行う
jaxp.jarをclasspathに追加する
(J2SE version 1.4.2以上が必須)

他にも以下のようなAPIが提供されている

Java Architecture for XML Binding (JAXB)
・・・XMLとJavaのオブジェクトマッピングを行う

Java API for XML Processing (JAXP)
・・・XML文書のパーサとXSLTのためのAPI

Java API for XML Registries (JAXR)
・・・UDDIのようなXMLレジストリへアクセスするためのAPI

Java API for XML-based RPC (JAX-RPC)
・・・JavaプログラムでRPCによる遠隔プログラム呼び出しを行なうためのAPI

SOAP with Attachments API for Java (SAAJ)
・・・SOAP メッセージの操作に使用するAPI
ダウンロード

DTD(文書型定義)