160 likes | 259 Views
Introduction to XML. DM 01k1024 諸星 宏行. XML とは何か?. XML はインターネットのための汎用的なデータ記述言語である データをテキスト形式で記述できるので、異なるプラットホームやアプリケーション間でもデータ交換ができる 自由にタグ名や使い方を定義でき、どんなデータでも記述することができる Web サービス、データベース、 B to B、Web パブリッシング、 EAI など様々な場面で使われている. XML 文書がサポートする仕様. XML1.0・・・XML の書き方、文法など
E N D
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 XMLParser Application DTD XML Schema XMLの処理の流れ ※ パーサはスキーマにしたがって、 XMLを解析(ツリー)し、情報を取得する。
XMLの構造 • XML文書は、XML宣言、DTD(文書型定義)、本体、の3つの部分に分かれている • XML宣言(XML declaration) • 先頭にあり、XMLのバージョンなどを定義 • DTD • どんな要素がどのように記述されるのか、 といった構造を定義(任意) • 本体(XML instance) • 開始タグ、終了タグの入れ子構造で表現し、 タグは自由に名前を付けることで意味をもたせることが出来る XML宣言 DTD(文書型定義) 本体 book.xml
Parent Brother Me Boy Girl First Child Second Child XMLの構造 • XMLのデータは全体的にツリー構造になっている <Parent> <Brother/> <Me> <Boy>First Child</Boy> <Girl>Second Child</Girl> </Me> </Parent>
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) • <!DOCTYPE manual [ • <!ELEMENT manual (title, preface, body, index) > • <!ELEMENT title (#PCDATA) > • 属性リスト宣言(attribute-list declaration) • <!ATTLIST title id ID #REQUIRED > • エンティティ宣言(entity declaration) • <!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"?> <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> </xsd:schema> customer.xml
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> </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> customer2.xml XML Schema(not ref).xsd
Document Parent Sibling Current Node Child 1 Child 2 XMLの操作(DOM) • ツリーベースのAPI • プロセッサがXMLデータを一気に読み込んで構文解析し、メモリ上にツリーを展開する • ツリーにアプリケーションがインターフェースを使ってランダムにアクセスして、要素を変更したり削除したりする • getFirstChild()…最初の子の取得 • getLastChild()…末の子の取得 • getNextSibling()…弟の取得 • getPreviousSibling()…兄の取得 • getChildNodes()…子供のリストの取得 • createElement()…要素の作成 • appendChild()…要素を最後尾に追加、 • removeChild()…要素の削除 • getElementsByTagName()…指定した名前の要素のリストを取得
Parent Child Child Child XMLの操作(DOM) • DOMを使ってXML文書を単純に表示するだけのプログラム ReadXML.java // XML documentの最上位要素の取得 Node firstNode = document.getDocumentElement(); getNode( firstNode ); // 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の出力 } getNextSibling()
XMLの操作(SAX) • イベントベースのAPI • 先頭から順にXMLデータを読み込んでいき、“要素の開始”や“要素の終わり”といったイベントを生成、その都度アプリケーションに通知する。 • アプリケーションはそれらのイベントを受け取ったときの処理を定義しておき、イベントを受け取ったときに呼び出されて処理を行う。 • 文書の開始 (startDocument)、文書の終了 (endDocument) • 要素の開始 (startElement)、要素の終了 (endElement) • 名前空間の開始 (startPrefixMapping)、名前空間の終了 (endPrefixMapping) • 文字列 (characters) • 処理命令 (processingInstruction) • Locatorオブジェクトの受け渡し(setDocumentLocator) • エンティティのスキップ (skippedEntity)
XMLの操作(SAX) • DOMを使ってXML文書を単純に表示するだけのプログラム PrintXML.java public void startDocument() throws SAXException{ System.out.println( "<?xml version = \"1.0\"?>" ); } <?xml version=”1.0”?> <parent> <brother/> <me> <girl>First child</girl> <boy>Second child</boy> </me> </parent> 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 ServicesDeveloper Packをダウンロードする • 他にも以下のような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 http://java.sun.com/webservices/downloads/webservicespack.html から“Download”を選択し、ダウンロード後、インストールを行う jaxp.jarをclasspathに追加する (J2SE version 1.4.2以上が必須)