Upload
chelsa
View
46
Download
1
Embed Size (px)
DESCRIPTION
第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 文書内の検索. - PowerPoint PPT Presentation
Citation preview
第9回 2007 年 6 月 22 日
「 XML パーサ」 -- Java で XML を処理 javax.xml.stream パッケージのパーサ SAX(Simple API for XML) のパーサDOM(Document Object Model) のパーサ応用 (1) – テーブルの利用応用 (2) – フィルタ的な処理 応用 (3) – DOM ツリーの検索応用 (4) – DOM ツリーの視覚化XPath -- XML 文書内の検索
フィルタ的処理の効率化文書の整形・変換 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 SchemaJAXB, SOAP, Web サービス ( 7月以降)
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>
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/ XSL/Transform"> <xsl:template match="/"> : </xsl:template>
</xsl:stylesheet>
<xsl:template match="text"> <p> <xsl:apply-templates /> </p> </xsl:template>
<xsl:template match="title” mode="inhead">
<title> <xsl:apply-templates /> </title> </xsl:template>
<xsl:template match="image"> <img> <xsl:attribute name="src"> <xsl:value-of
select="@s"/> </xsl:attribute> </img> </xsl:template>
abc //abc abc[1] @xyz
javax.xml.transform パッケージインタフェース Source 抽象化された入力元 変換前の文書 変換の XSL ファイルインタフェース Result 抽象化された出力先 変換後の文書
ローカルファイルWeb 上の資源DOM ツリーSAX で処理中の文書*それぞれに応じて実体を提供 3つのサブパッケージの役割り 処理そのものに違いは生じない
Source inputSource = new
StreamSource( "sample6.xml" ); Source transSource = new StreamSource( "trans.xsl" ); Result outputResult = new StreamResult( System.out );
Transofromer クラス 変換を実行する抽象クラス
TransformerFactory tf = TransformerFactory.newInstance();Transformer transformer = tf.newTransformer( transSource );
変換の実行
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 以外でも利用
<wakhok:image source="java.png“ width="512" height="400"/> : <tatsuo:image src="elephant.png“ w="64“ h="64"/>
<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>
<tatsuo:doc xmlns:tatsuo
="http://www.tatsuo.com"/> <tatsuo:title> Java
</tatsuo:title> <tatsuo:image s=“java.png” /> </tatsuo:doc>
Prefix の名称を省略 (URI のみ指定 )この場合でも立派な名前空間 <document
xmlns="http://www.wakhok.ac.jp/"> <title>Java and XML</title>
<image s="java.png" w="128" h="64"/>
</document>
xmlns: はなぜ URI なしでもいいのか? xml で始まるプレフィックスは特別 ( 一般の XML 文書では使用できない )
<xml:image source="elephant.png"
xmlns:xml="http://www.wakhok.ac.jp"/>
この表記はエラーとなる
たった1つのインタフェース NamespaceContextたった1つのクラス QName
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 クラスを利用
名前空間の処理はオプショナルパーサへの通知 (Factory クラスに )
SAXParserFactory spf =
SAXParserFactory.newInstance();spf.setNamespaceAware( true ); SAXParser parser =
spf.newSAXParser();
Prefix と URI の処理がポイント
void startElement( String uri, String localName, Stirng qName, Attributes attr )
ある名前空間の有効範囲に入った時 startPrefixMapping( String p,
String u)ある名前空間の有効範囲が終わった時 endPrefixMapping( String p )