300 likes | 573 Views
Java/XML 総まとめ. 2005 年 7 月 14 日 植田龍男. 本講座の内容. XML 文書の構文解析(パーサ ) SAX, DOM XML 文書処理の基本サービス XSLT, XPath, 名前空間 XML 文書の設計と妥当性の検証 DTD, W3C XML Schema *上記のことを Java のアプリケーションのレベルで実現するには?. J2SE 5.0 と XML API. javax.xml javax.xml.parsers javax.xml.transform
E N D
Java/XML 総まとめ 2005年7月14日 植田龍男
本講座の内容 • XML文書の構文解析(パーサ) SAX, DOM • XML文書処理の基本サービス XSLT, XPath, 名前空間 • XML文書の設計と妥当性の検証 DTD, W3C XML Schema *上記のことをJavaのアプリケーションのレベルで実現するには?
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
パーサ(parser)とは? • XML文書の字句解析を行う • 要素、属性の情報、文書の構造 • 標準の規格が存在 SAX( Simple API for XML ) DOM( Document Object Model ) その他(JDOM 等)
SAX の考え方 • 文書を読み込みながら逐次処理 • 処理の内容をあらかじめHandlerのクラスに登録(イベント駆動型の処理) startDocument(), startElement() –要素名、属性の情報 characters() –テキストの内容の情報
SAX の startElement() メソッド public void startElement( String nameSpace, String localName, String qName, Attributes attrs ) throws SAXException { }
SAXの処理の特徴 • 文書の内容は1度だけ処理 • メモリは少なくてすむ • 処理の終わった情報、文書の構造は記憶に残らない (アプリケーションが独自に対応) • 大規模な文書の処理も比較的容易
DOMの考え方 • 文書はツリー構造である • 構造そのものをメモリ上に記憶 (すべて読み込んでから処理を開始) • ツリー構造を表すインタフェース Node とそのサブインタフェース群 Element, Text, Attr, Document
org.w3c.dom.Node のメソッド • getChildNodes() • appendChild() • removeChild() • getNodeType() • getNodeName() • getNodeValue()
DOMの処理の特徴 • 文書の構造をそっくり記憶 • 一度読み込んだ内容を何度でも処理できる • 構造の編集も可能 • 大規模な文書の処理にはメモリ資源が必要
javax.xml.parses の思想 • 抽象化されたクラスを通じてパーサの実装を入手 • 実行環境に依存しない処理の実現
SAX パーサの入手 SAXParserFactory spf =SAXParserFactory.newInstance(); SAXParser parser = spf.newSAXParser(); XMLReader reader = parser.getXMLReader();
DOMパーサの入手 DocumentBuilderFactory dbf =DocumentBuilderFactory.newInstance(); DocumentBuilder db = dbf.newDocumentBuilder();
XPath の抽象化されたサービス XPathFactory xpf = XPathFactory.newInstance(); XPath xpath = xpf.newXPath(); NodeList list = (NodeList)xpath.evaluate( "//abc”, new InputSource( s15.xml ), XPathConstants.NODESET );
XSLT の考え方 • 入力先 Source 変換前文書、変換ルール文書(XSL) • 出力先 Result 変換後文書 • 変換エンジン Transformer
Source,Resultの実装クラス • javax.xml.transform.stream StreamSource, StreamResult • javax.xml.transform.sax SAXSource, SAXResult • javax.xml.transform.dom DOMSource, DOMResult
XMLの名前空間 <wakhok:document xmlns:wakhok ="http://www.wakhok.ac.jp/public"> <wakhok:title> Java and XML</wakhok:title> : </wakhok:document>
名前空間の表現方法 • プレフィックス • URI • ローカル名 <wakhok:document xmlns:wakhok ="http://www.wakhok.ac.jp/public">
名前空間の処理 • パーサへの通知(Factoryクラスに) SAXParserFactory spf = SAXParserFactory.newInstance(); spf.setNamespaceAware( true ); SAXParser parser = spf.newSAXParser();
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 の形式
XML文書の設計とスキーマ言語 • スキーマ言語 DTD (document type definition) XML Schema W3C XML Schema RELAX NG Schematron
DTD と妥当性の検証 • DTD( Document Type Definition) • XMLのルールを記述する専用言語 • SGMLからの流れ • 当初のXMLはすべてDTDで書かれた • XMLとは全く異なる文法 • 表現力の制約、名前空間の制約
DTDの例 <!DOCTYPE name [<!ELEMENT name (first, last)> <!ELEMENT first (#PCDATA)> <!ELEMENT last (#PCDATA)>] > <name> <first>Tatsuo</first> <last>Ueda</last> </name>
さらに複雑なDTDの例 <!ELEMENT document (title?,(text|image)*)> <!ELEMENT title (#PCDATA)> <!ELEMENT text (#PCDATA)> <!ELEMENT image EMPTY> <!ATTLIST image s NMTOKEN #REQUIRED w NMTOKEN #IMPLIED h NMTOKEN #IMPLIED>
DTDによる検証を実行する SAXParserFactory spf = SAXParserFactory.newInstance(); spf.setValidating( true ); SAXParser parser = spf.newSAXParser(); XMLReader reader = parser.getXMLReader();
W3C XML Schema の特徴 • 優れた表現力 • 厳密な定義 • 豊富なデータ型 • 名前空間の利用 • それ自身がXMLである! • 事実上の標準規格
XML Schema の例 <xsd:schema xmlns:xsd ="http://www.w3.org/2001/XMLSchema"> <xsd:element name="name" type="nameType"/> <xsd:complexType name="nameType"> <xsd:sequence> <xsd:element name="first" type="xsd:string"/> <xsd:element name="last" type="xsd:string"/> </xsd:sequence> </xsd:complexType> </xsd:schema>
XML Schemaによる検証(SAX) SAXParserFactory spf = SAXParserFactory.newInstance(); spf.setNamespaceAware( true ); spf.setValidating( true ); SAXParser parser = spf.newSAXParser(); parser.setProperty( "http://java.sun.com/xml/jaxp/properties/ schemaLanguage", "http://www.w3.org/2001/XMLSchema" );
javax.xml.validation の例 SchemaFactory sf = SchemaFactory.newInstance( "http://www.w3.org/2001/XMLSchema" ); Schema schema = sf.newSchema( new StreamSource( args[0] ) );
javax.xml.validation の例(2) try { Validator validator = schema.newValidator(); validator.validate( new StreamSource( args[1] ) ); } catch( Exception e ) { }