富永・田中・岡島

事前準備




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では使用できない文字について別の表記を用意し
てある文字の代替方法をエンティティ参照という。
文字
エンティティ参照による表記
<
(右大なり)
&lt;
>
(左大なり)
&gt;
&
(アンパーサント)
&amp;
"
(ダブルクォーテーション)
&quot;
'
(シングルクォーテーション)
&apos;
ここまでのまとめ






ちゃんとはさむ(開始と終了を必ず記述)
大文字と小文字は別文字として認識される
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文書を
作成せよ。
実行結果は下図のようになるよう
にしてください。
磯野家
親 波平 舟 子 サザエ カツオ ワカメ 孫 タラオ