事前準備 ttsshでのログイン フォルダ名 XML ファイルコピー cp ~hurry-go-round/Java/XML/* .
第11回 Javaゼミ 「XML」 2006/12/18 富永 祐樹 田中 雄 岡島 敬
XMLってなんだ? eXtensible :伸張性のある Markup :記し付け Language :言語 一言でくくるならば、 すなわち、「拡張可能なテキストへの印付けのためのコンピュータ用言語」のこと。 もともとは、SGMLというコンピュータ用の言語があったのだが、 複雑で扱いにくいため、XMLやHTMLが考え出された。
XMLの基本 XMLの基本はタグ付けと構造化の2つ。 タグ付け タグ付けにより情報を付加することを、Markupという。これにより、ただのテキストファイルがそれ以上の表現力をもつことになる。 例: <DATA>・・・・・・</DATA> ←これを、タグ付けという。 HTMLの場合はタグが決められていたのに対して、 XMLではタグが定義されていないので、タグは自由に設定できる。だが、その反面チェックが厳しくなっている。
XMLでのタグ <TAG>要素内容</TAG> ・主なタグの名称 タグの制約 ・空要素は認められない。その場合は必ず、<IMG/>のような形をとること。これを、空要素タグという。 ・大文字と小文字を区別するので、<A>・・・・</a>のような形は認識されない。 要素 要素型
構造化 タイトル 項目 本文 項目 本文 ・このように、ページデザインに頼らなくても 構造が理解できるようにする。 ・コンピュータが「論理的に構造」が理解できるタグ付きテキストを目指す。 タイトル ・このように、ページデザインに頼らなくても 構造が理解できるようにする。 * HTML文では、h1~pまでの要素型の宣言を変えることで視覚的にわかりやすくしていた。 項目 本文 項目 本文
XMLとHTMLとの比較 HTML XML ・markupの意味づけとして 既定のものが存在 ・markupの意味づけに 関する定義がない →既定のものを利用して簡単に表現ができる。 拡張が制限。 XML ・markupの意味づけに 関する定義がない →自分で意味づけをすることになり、その設計を自分で行う。 拡張可能。
XMLの作成 XMLはメモ帳で作成可能。 1.基本はタグを利用した入れ子構造 例: <Try> ・・・・</Try> ダメな例: <I>・・・・<you>・・・・・</I>・・・・</you> 2.属性値は必ず、“”か‘’で囲む 例: <img src=“/my_picture.gif” /> ダメな例: <img src=/my_picture.gif />
・・・・・・・・・ World 文書要素 例: Country1 Country2 Country3 Name Capital ここで構造化に戻って、考えてみよう。 タグの入れ子構造を表現するのに、木構造を思い浮かべながら考えて、以下のような構造を作ってみる。 World 文書要素 例: Country1 Country2 Country3 Name Capital ・・・・・・・・・
Point1:要素を含むほうが親で、含まれるほうが子供。 <考え方のコツ> 文書要素はHTML文における<body>~</body>だと思って使えばよい。
文書要素 <World> <Country ID="1"> <Name>日本</Name> <Capital>東京</Capital> </Country> <Country ID="2"> <Name>アメリカ合衆国</Name> <Capital>ワシントン D.C</Capital> <Country ID="3"> <Name>イギリス</Name> <Capital>ロンドン</Capital> </World> 文書要素
それ以外にも、XML宣言が必要であり、 例:<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"> というような、HTMLの時にも行ったものと同様に行う。 ので、以下の文をXMLファイルの1行目に加える。 <?xml version="1.0" encoding="Shift_JIS"?> ・XMLのバージョンが1.0である ・文字コードがシフトJISである という情報が定義されたことになる。 これによるメリットは、XMLはネット上での情報をやりとりする際に、 OSやアプリケーションに関係なく表示できるようになることである。
エンティティ XMLでは使用できない文字について別の表記を用意してある文字の代替方法をエンティティ参照という。 文字 エンティティ参照による表記 < (右大なり) < > (左大なり) > & (アンパーサント) & " (ダブルクォーテーション) " ' (シングルクォーテーション) '
ここまでのまとめ ちゃんとはさむ(開始と終了を必ず記述) 大文字と小文字は別文字として認識される HTMLよりXMLの方が面倒くさいけど、自由度が高い。 属性値 は“”か‘’で必ず囲む 構造は木構造で、一番大きいものを文書要素という。 “”内に“”を使う際は、エンティティ参照による表記で行う。
やってみよう! 次の木構造のデータTree.xmlを作ってください。 ・・・ Country University Name Place 自分の名前 自分の住所 東海大学 日本
ヒント <?xml version="1.0" encoding="Shift_JIS"?> <> <> </> </>
DTD(Document Type Definition) ルール通りのタグ形式 (整形式文書の規則+DTD) ↓ 妥当な文書 (valid XML document)という。 チェック 整形式文書 妥当な文書
Well-fomedとvalid XMLプロセッサがチェックする際well-formedであるかvalidであるかをチェックする場合があります。 Well-formed:整形式文書のみ Valid:整形式文書+データ構造チェック(DTD)
サブセットの種類 サブセット DOCTYPE宣言でDTD(DocumentTypeDifinition)を指定することにより、表示方法を表すスタイルシートを宣言できる。表示方法は下記の2つ 外部サブセット→別ファイル(DTD)で宣言して呼び出す。 <!DOCTYPE 文書要素名 外部DTDサブセットの呼び出し> 内部サブセット→XMLファイル内で宣言する。 <!DOCTYPE 文書要素名 [ 内部DTDサブセット ]>
要素型宣言(Element Type Declaration) 文字データを含まず要素のみ 文字データと要素が混ざっている 例1:World1.xml 例2:World2.xml <World> <Country> <Name></Name> <Capital></Capital> </Country> </World> <World>世界 <Country>国 <Name>日本</Name> <Capital>東京</Capital> </Country> </World>
WorldCountry.xml <?xml version="1.0" encoding="Shift_JIS"?> <Country ID="1"> <Name>日本</Name> <Capital>東京</Capital> </Country> <Country ID="2"> <Name>アメリカ合衆国</Name> <Capital>ワシントン D.C</Capital> <Country ID="3"> <Name>イギリス</Name> <Capital>ロンドン</Capital> </World>
サブセットの書き方 文書要素 【イメージ】 サブセットの例を示すと、 <!ELEMENT World (Country*)> <!ELEMENT Country (Name, Capital)> <!ATTLIST Country ID CDATA #REQUIRED> #REQUIREDは必須の意。IDの数のこと。 <!ELEMENT Name (#PCDATA)> #PCDATAは要素内容があることを示す。 <!ELEMENT Capital (#PCDATA)> 【イメージ】
外部サブセット 内部サブセット 例:<!DOCTYPE World SYSTEM “World.dtd"> サブセットをXMLに加えてみよう 外部サブセット 例:<!DOCTYPE World SYSTEM “World.dtd"> 外部サブセットをXML内で呼び出すファイルの指定は <!DOCTYPE ・・・ SYSTEM “DTDファイル名”>で行う。 内部サブセット 例:<!DOCTYPE World [<!ELEMENT World (Country*)>・・・]>で行う
内容モデル:DTD内で可能な組合せや並び方を示すことをいいます。 例1:<!ELEMENT World (Country)> Worldという名の要素はその内容として 要素Countryをちょうど一つ持つ 例2: <!ELEMENT World (Country*)> Worldという名の要素はその内容として 要素Countryをちょうど0回以上の繰り返し持つ 例1 例2
内容モデルで使う記号 | --- 選択リスト , --- 順序リスト + --- 1回以上の繰り返し * --- 0回以上の繰り返し ? --- 0回または1回 例1:<!ELEMENT A(a|b)> : a | b の場合は要素aか要素bのどちらかという意味 例2:<!ELEMENT A(a,b)> a , b の場合は要素aの次に要素b、 という意味になります。
↓ ↓ <World> <Country> <Name></Name> 文字データを含まず要素のみ 文字データと要素が混ざっている 例1:World1.xml 例2:World2.xml <World> <Country> <Name></Name> <Capital></Capital> </Country> </World> <World>世界 <Country>国 <Name>日本</Name> <Capital>東京</Capital> </Country> </World> ↓ ↓ World1.dtdを作成 <!ELEMENT World(Country)> <!ELEMENT Country(Name,Capital)> <!ELEMENT Name EMPTY)> <!ELEMENT Capital EMPTY)> World2.dtdを作成 <!ELEMENT World(#PCDATA|Country)*> <!ELEMENT Country(#PCDATA|Name|Capital)*> <!ELEMENT Name(#PCDATA)> <!ELEMENT Capital(#PCDATA)>
やってみよう!Ver.2 最初に作ったTree.xmlのDTDファイルTree.dtdを作って、Tree.xmlに外部サブセットの宣言文を加えたTree2.xmlを作ってください。 ・・・ Country University Name Place 自分の名前 自分の住所 東海大学 日本
ヒント 【Tree.dtdの内容のヒント】 <!ELEMENT ()> の4行の空欄を埋めてください。 【外部サブセットの宣言文のヒント】 <!DOCTYPE ・・・ SYSTEM “DTDファイル名”> ↑ ここにTree.xmlの文書要素を入れる。
パーサAPI DOM(DocumentObjectModel) XMLファイルをチェックするアプリケーションのこと、 DOM(DocumentObjectModel) XMLドキュメント全体を読み込み、メモリ上に要素のオブジェクトツリーを作成する。 SAX(Simple API for XML) ドキュメントを読み込みながら、ドキュメントの開始・終了や、要素の開始・終了・エラーなどのイベント検出、プログラムに通知する。
Dom3.java XML文書を読み込んでドキュメントの妥当性を検査するプログラムである。 import org.w3c.dom.*; import org.apache.xerces.parsers.*; import javax.xml.parsers.*; class Dom3{ public static void main(String argv[]){ try{ DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); factory.setValidating(true); DocumentBuilder builder = factory.newDocumentBuilder(); Document doc = builder.parse(argv[0]); }catch(Exception e){ System.out.println(e); } XML文書を読み込んでドキュメントの妥当性を検査するプログラムである。
DomDisp.java import org.w3c.dom.*; import org.apache.xerces.parsers.*; import javax.xml.parsers.*; class DomDisp{ public static void main(String argv[]){ try{ DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); factory.setValidating(true); DocumentBuilder builder = factory.newDocumentBuilder(); Document doc = builder.parse(argv[0]); System.out.println(doc.getNodeName()); int n = doc.getChildNodes().getLength(); Disp(doc); }catch(Exception e){ System.out.println(e); }
DomDisp.javaの続き public static void Disp(org.w3c.dom.Node node){ int n = node.getChildNodes().getLength(); System.out.println("name = "+node.getNodeName()); System.out.println("value = "+node.getNodeValue()); for(int i = 0; i < n; ++i){ Disp(node.getChildNodes().item(i)); } ノードを名前とその値を順番に表示するプログラムである。 ノードの名前と値の返り値については、 http://www.ep.u-tokai.ac.jp/~nakazato/API/1.4.0/docs/ja/api/を参照
SAX.java Dom3.javaと同様の処理をSAXで行っている。 import javax.xml.parsers.*; import org.xml.sax.*; import org.xml.sax.helpers.*; class SAX{ public static void main(String argv[]){ try{ XMLReader parser = XMLReaderFactory.createXMLReader("org.apache.xerces.par sers.SAXParser"); parser.setFeature("http://xml.org/sax/features/validation", true); DefaultHandler handler = new MySAXHandler(); parser.setContentHandler(handler); parser.parse(argv[0]); } catch(Exception e){ System.out.println(e); } Dom3.javaと同様の処理をSAXで行っている。
SAX.javaの続き1 class MySAXHandler extends DefaultHandler{ public void startDocument() throws SAXException { System.out.println("startDocument()"); } public void endDocument() throws SAXException System.out.println("endDocument()"); ドキュメントの開始と終了の通知を受け取り出力している。
SAX.javaの続き2 public void startElement(String uri, String localName, String qName, Attributes atts) throws SAXException{ System.out.println("startElement()"); System.out.println("localName = " + localName); for(int i = 0; i < atts.getLength(); ++i){ System.out.println(atts.getLocalName(i)); System.out.println("val = " + atts.getValue(i)); } public void characters(char[] ch, int start, int len) throwsSAXException{ System.out.println(new String(ch, start, len)); エレメント開始の通知を受け取り、内容を出力している。 文字データの通知を受け取り、内容を出力している。
XSL XMLファイルをWeb上でどのように表示するかを指定することができる。 XMLファイルはこのXSLを指定しないと、タグのみの表記になってしまうので、つまらないと感じたならば使ってみよう。 XSLTスタイルシートにしたがってXMLデータをXSLTプロセッサがHTML表示に変換してくれる。 必要なもの: ・XSLファイル ・XMLファイルに以下の表記を追記したもの <?xml-stylesheet type=“text/xsl” href=“XSLファイル名"?>
WorldCountry.xsl <?xml version="1.0" encoding="Shift_JIS"?> <xsl:stylesheet version="1.0"xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <xsl:template match="/"> <html> <body> <h1>World Countrys</h1> <p><xsl:value-of select="World" /></p> </body> </html> </xsl:template> </xsl:stylesheet> 要素Worldの子にあたる要素を表示。 HTML文を記述。
やってみよう!Ver.3 最初に作成したTree.xmlにXSLを使えるように変更したTree3.xmlを作成し、XSLファイルTree.xslを作成して、表示させよ。 XMLファイルを開くと下図のようになるように作成してください。 Tree 日本 東海大学 自分の名前 自分の住所
宿題1 Isono.xml サザエさんの家族構成を下記のように規定したIsono.xmlを作成せよ。 波平 舟 サザエ カツオ ワカメ タラオ
宿題2 Isono.dtd Isono2.xml 宿題1で作ったIsono.xmlを見てIsono.dtdを作成せよ。同時にIsono.xmlをdtdを外部サブセットとして読み込む宣言文を加えたIsono2.xmlを作ってください。 ※完成したxmlをDom3.javaを使ってチェックしてエラーが出ないか確認してください。
宿題3 Isono.xsl Isono3.xml 磯野家 宿題1で作ったIsono.xmlを基にxsl文書を扱えるように変更したIsono3.xmlとIsono.xsl文書を作成せよ。 実行結果は下図のようになるようにしてください。 磯野家 親 波平 舟 子 サザエ カツオ ワカメ 孫 タラオ