事前準備 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との比較 XML ・markupの意味づけに 関する定義がない →自分で意味づけをする ことになり、その設計を 自分で行う。 拡張可能。 HTML ・markupの意味づけとして 既定のものが存在 →既定のものを利用して 簡単に表現ができる。 拡張が制限。 XMLの作成 XMLはメモ帳で作成可能。 1.基本はタグを利用した入れ子構造 例: <Try> ・・・・</Try> ダメな例: <I>・・・・<you>・・・・・</I>・・・・</you> 2.属性値は必ず、“”か‘’で囲む 例: <img src=“/my_picture.gif” /> ダメな例: <img src=/my_picture.gif /> ここで構造化に戻って、考えてみよう。 タグの入れ子構造を表現するのに、木構造を思い浮かべなが ら考えて、以下のような構造を作ってみる。 例: Country1 Name 文書要素 World Country2 Capital Country3 ・・・・・・・・・ Point1:要素を含むほうが親で、含まれるほうが子供。 Point2:木構造からもわかるとおり、親が複数の子を持つこと があっても、子供が複数の親を持つことはない。 Point3:上方向を先祖で下方向を子孫としてみたときに、一番 上にある要素を文書要素という。 <考え方のコツ> 文書要素はHTML文における<body>~</body>だと思っ て使えばよい。 <World> <Country ID="1"> <Name>日本</Name> <Capital>東京</Capital> </Country> <Country ID="2"> <Name>アメリカ合衆国</Name> <Capital>ワシントン D.C</Capital> </Country> <Country ID="3"> <Name>イギリス</Name> <Capital>ロンドン</Capital> </Country> </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とは タグのルールをDTD(文書型定義)とい う仕様で規定する。 チェック ルール通りのタグ形式 (整形式文書の規則+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) 要素型宣言は、 <!ELEMENT 要素名 制約条件> とい う形で、 要素名で指定された名前を持つ要素の内容に 制約を与えます。 文字データを含まず要素のみ 例1:World1.xml <World> <Country> <Name></Name> <Capital></Capital> </Country> </World> 文字データと要素が混ざっている 例2:World2.xml <World>世界 <Country>国 <Name>日本</Name> <Capital>東京</Capital> </Country> </World> WorldCountry.xml <?xml version="1.0" encoding="Shift_JIS"?> <World> <Country ID="1"> <Name>日本</Name> <Capital>東京</Capital> </Country> <Country ID="2"> <Name>アメリカ合衆国</Name> <Capital>ワシントン D.C</Capital> </Country> <Country ID="3"> <Name>イギリス</Name> <Capital>ロンドン</Capital> </Country> </World> サブセットの書き方 文書要素 サブセットの例を示すと、 <!ELEMENT World (Country*)> !ELEMENTは要素を宣言している。 <!ELEMENT Country (Name, Capital)> <!ATTLIST Country ID CDATA #REQUIRED> #REQUIREDは必須の意。IDの数のこと。 <!ELEMENT Name (#PCDATA)> #PCDATAは要素内容があることを示す。 <!ELEMENT Capital (#PCDATA)> 【イメージ】 サブセットを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、 という意味になります。 文字データを含まず要素のみ 例1:World1.xml 文字データと要素が混ざっている 例2:World2.xml <World> <Country> <Name></Name> <Capital></Capital> <World>世界 <Country>国 <Name>日本</Name> <Capital>東京</Capital> </Country> </World> </Country> </World> ↓ ↓ World1.dtdを作成 World2.dtdを作成 <!ELEMENT World(Country)> <!ELEMENT Country(Name,Capital)> <!ELEMENT Name EMPTY)> <!ELEMENT Capital EMPTY)> <!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 ()> <!ELEMENT ()> <!ELEMENT ()> <!ELEMENT ()> の4行の空欄を埋めてください。 【外部サブセットの宣言文のヒント】 <!DOCTYPE ・・・ SYSTEM “DTDファイル名”> ↑ ここにTree.xmlの文書要素を入れる。 パーサAPI XMLファイルをチェックするアプリケーションのこと、 DOM(DocumentObjectModel) XMLドキュメント全体を読み込み、メモリ上に要素のオブジェクトツ リーを作成する。 SAX(Simple API for XML) ドキュメントを読み込みながら、ドキュメントの開始・終了や、要素の 開始・終了・エラーなどのイベント検出、プログラムに通知する。 Dom3.java 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 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文書を 作成せよ。 実行結果は下図のようになるよう にしてください。 磯野家 親 波平 舟 子 サザエ カツオ ワカメ 孫 タラオ
© Copyright 2024 ExpyDoc