XMLの名前空間

応用Java(Java/XML) 第10回
2005年6月23日
植田龍男
後半の内容の予定
XPath (6/9)
 XSLT (6/16)
 名前空間(Namespace) (6/23)
 XML文書の妥当性の検証(7/7,14)
DTD,XML Schema

J2SE 5.0 と XML API










javax.xml
javax.xml.parsers
javax.xml.transform
javax.xml.transform.dom
javax.xml.transform.sax
javax.xml.transform.stream
javax.xml.xpath
javax.xml.namespace
javax.xml.validation
javax.xml.datatype
前回の復習(宿題)
以下の要素をHTMLの形式に変換
<link to="http://www.wakhok.ac.jp">
See more... </link>

変換後:
<a href=“http://www.wakhok.ac.jp”>
See more… </a>
宿題の答え(xslファイルの記述)
<xsl:template match="link">
<a>
<xsl:attribute name="href">
<xsl:value-of select="@to"/>
</xsl:attribute>
<xsl:apply-templates />
</a>
</xsl:template>
もう1つの宿題
<xsl:template match="text">
の xsl: ってどういう意味?
 <xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/
XSL/Transform">
のURIは何の働きをしているの?

名前空間とは?



名前の衝突の回避(一意性の保証)
ローカル名の前に「場所」を指定
XML以外でも利用
XMLの名前空間の例(1) Prefix
<wakhok:image
source="java.png“
width="512" height="400"/>
:
<tatsuo:image
src="elephant.png“
w="64“ h="64"/>
XMLの名前空間の例(2) URI
<wakhok:document
xmlns:wakhok
="http://www.wakhok.ac.jp/public"
xmlns:tatsuo
="http://www.wakhok.ac.jp/tatsuo">
<wakhok:title>
Java and XML</wakhok:title>
:
</wakhok:document>
名前空間の例(3) 有効範囲
<tatsuo:image
src="elephant.png“
w="64" h="64"
xmlns:tatsuo
="http://www.wakhok.ac.jp/tatsuo"/>
名前空間の例(4) Prefixの省略
Prefixの名称を省略(URIのみ指定)
 この場合でも立派な名前空間
<document
xmlns="http://www.wakhok.ac.jp/">
<title>Java and XML</title>
<image s="java.png" w="128"
h="64"/>
</document>

名前空間の例(5) 特別なPrefix


xmlns: はなぜURIなしでもいいのか?
xml で始まるプレフィックスは特別
(一般のXML文書では使用できない)
<xml:image source="elephant.png"
xmlns:xml="http://www.wakhok.ac.jp"/>
この表記はエラーとなる
名前空間の処理(1)

パーサへの通知(Factoryクラスに)
SAXParserFactory spf
= SAXParserFactory.newInstance();
spf.setNamespaceAware( true );
SAXParser parser = spf.newSAXParser();
名前空間の処理(2)

PrefixとURIの処理がポイント
void startElement(
String uri,
String localName,
Stirng qName,
Attributes attr )
SAX処理での名前空間の検知


ある名前空間の有効範囲に入った時
startPrefixMapping( String p, String u)
ある名前空間の有効範囲が終わった時
endPrefixMapping( String p )
javax.xml.namespace


たった1つのインタフェース
NamespaceContext
たった1つのクラス
QName
NamespaceContext






3個のメソッドの実装を要求
プレフィックスとURIの変換の手段
getNamespaceURI( String prefix)
getPrefix( String uri )
getPrefixes( String uri )
URI : Prefix は1対他の可能性もある
QName (Qualified Name )





URI, Prefix, ローカル名の情報を格納
QName(String local)
QName(String uri, String local)
QName(String uri, String local, String prefix)
getLocalPart(), getPrefix()
getNamespaceURI()
equals() – URIとローカル名のみで判定
toString() – { URI }localName の形式
Quorified Name

Qnameクラスの利用例
public void startElement(
String nameSpace, String localName,
String qName, Attributes attrs ) {
System.out.println(
new QName( nameSpace, localName ) );