Transcript DTD(文書型定義)
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