310 likes | 471 Views
第9回 2007 年 6 月 22 日. 応用 Java (Java/XML). 前回までやったこと. 「 XML パーサ」 -- Java で XML を処理 javax.xml.stream パッケージのパーサ SAX(Simple API for XML) のパーサ DOM(Document Object Model) のパーサ 応用 (1) – テーブルの利用 応用 (2) – フィルタ的な処理 応用 (3) – DOM ツリーの検索 応用 (4) – DOM ツリーの視覚化 XPath -- XML 文書内の検索.
E N D
第9回 2007年6月22日 応用Java (Java/XML)
前回までやったこと • 「XMLパーサ」-- Java でXMLを処理 • javax.xml.stream パッケージのパーサ • SAX(Simple API for XML) のパーサ • DOM(Document Object Model)のパーサ • 応用(1) – テーブルの利用 • 応用(2) – フィルタ的な処理 • 応用(3) – DOMツリーの検索 • 応用(4) – DOMツリーの視覚化 • XPath -- XML文書内の検索
本日(6/22)の講義内容 • フィルタ的処理の効率化 • 文書の整形・変換 • XSLとXSLT • javax.xml.transform javax.xml.transform.stream javax.xml.transform.sax javax.xml.transform.dom
後半の内容の予定 • XPath (6/15) • XSLT (6/22) • 名前空間(Namespace) (6/22) • XML文書の妥当性の検証(6/29) XML Schema • JAXB, SOAP, Webサービス(7月以降)
XSLTとは? • XSL Transform XML文書を別の形式の文書へ変換 • XSL(eXtensible Stylesheet Language) 変換のルールもまたXML文書で記述 (XSLファイル) • 変換前の文書、変換後の文書、変換のための文書
変換前の文書の例 <document> <title>Java and XML</title> <text> Let's begin, now! </text> <image s=“java.png” w=“128”h="64"/> </document>
XSLTによる変換の例(1) <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/ XSL/Transform"> <xsl:template match="/"> : </xsl:template> </xsl:stylesheet>
XSLTによる変換の例(2) <xsl:template match="text"> <p> <xsl:apply-templates /> </p> </xsl:template>
XSLTによる変換の例(3) <xsl:template match="title” mode="inhead"> <title> <xsl:apply-templates /> </title> </xsl:template>
XSLTによる変換の例(4) <xsl:template match="image"> <img> <xsl:attribute name="src"> <xsl:value-of select="@s"/> </xsl:attribute> </img> </xsl:template>
参照:XPathの検索パターン abc //abc abc[1] @xyz
XSLT のAPI(1) • javax.xml.transform パッケージ • インタフェース Source 抽象化された入力元 変換前の文書 変換のXSLファイル • インタフェース Result 抽象化された出力先 変換後の文書
SourceやResultの実体は? • ローカルファイル • Web上の資源 • DOMツリー • SAXで処理中の文書 *それぞれに応じて実体を提供 3つのサブパッケージの役割り 処理そのものに違いは生じない
XSLT のAPI(2) Source inputSource = new StreamSource( "sample6.xml" ); Source transSource = new StreamSource( "trans.xsl" ); Result outputResult = new StreamResult( System.out );
XSLT のAPI(3) • Transofromerクラス 変換を実行する抽象クラス TransformerFactory tf = TransformerFactory.newInstance(); Transformer transformer = tf.newTransformer( transSource );
XSLT のAPI(4) • 変換の実行 transformer.transform( inputSource, outputResult ); *これでResultに結果が格納
本日のサンプルプログラム public static void main( String[] args ) { Source inputSource = new StreamSource( "sample6.xml" ); Source transSource = new StreamSource( args[0] ); Result outputResult = new StreamResult( System.out ); TransformerFactory tf = TransformerFactory.newInstance(); Transformer transformer = tf.newTransformer( transSource ); transformer.transform( inputSource, outputResult ); }
変換後の文書の例 <html> <head> <title>Java and XML</title> </head> <body> <h1>Java and XML</h1> <hr> <p> Let's begin, now! :
ところで気になることが・・・ • <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 </wakhok:title> <tatsuo:title> XML </tatsuo:title> : </wakhok:document>
名前空間の例(3) 有効範囲 <tatsuo:doc xmlns:tatsuo ="http://www.tatsuo.com"/> <tatsuo:title> Java </tatsuo:title> <tatsuo:image s=“java.png” /> </tatsuo:doc>
名前空間の例(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"/> この表記はエラーとなる
javax.xml.namespace • たった1つのインタフェース NamespaceContext • たった1つのクラス QName
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 の形式
名前空間の処理 • javax.xml.stream パッケージの場合 • 常に名前空間を認識 • 処理は QName クラスを利用
名前空間の処理:SAX,DOM(1) • 名前空間の処理はオプショナル • パーサへの通知(Factoryクラスに) SAXParserFactory spf = SAXParserFactory.newInstance(); spf.setNamespaceAware( true ); SAXParser parser = spf.newSAXParser();
名前空間の処理:SAX,DOM(2) • PrefixとURIの処理がポイント void startElement( String uri, String localName, Stirng qName, Attributes attr )
SAX処理での名前空間の検知 • ある名前空間の有効範囲に入った時 startPrefixMapping( String p, String u) • ある名前空間の有効範囲が終わった時 endPrefixMapping( String p )