330 likes | 511 Views
第12回 2007 年 7 月 13 日. 応用 Java (Java/XML). 前回までやったこと. 「 XML パーサ」 -- Java で XML を処理 javax.xml.stream パッケージのパーサ SAX(Simple API for XML) のパーサ DOM(Document Object Model) のパーサ パーサの応用 : 検索 , フィルタ的な処理 、視覚化 パーサの上位のサービス XPath , XSLT スキーマ言語と妥当性の検証
E N D
第12回 2007年7月13日 応用Java (Java/XML)
前回までやったこと • 「XMLパーサ」-- Java でXMLを処理 javax.xml.stream パッケージのパーサ SAX(Simple API for XML) のパーサ DOM(Document Object Model)のパーサ パーサの応用 : 検索,フィルタ的な処理 、視覚化 • パーサの上位のサービス XPath ,XSLT • スキーマ言語と妥当性の検証 • JAXB( Javaとスキーマとの変換)
後半の内容の予定 • XPath (6/15) • XSLT (6/22) • 名前空間(Namespace) (6/22) • XML文書の妥当性の検証(6/29) XML Schema • JAXB (7/6, 7/13) • SOAP, Webサービ(7/20) • 試験(7/27)
本日(7/13)の講義内容 • JAXB JavaとXMLの変換のフレームワーク) の続き • javax.xml.bind パッケージ アプリケーション内で変換の実現 • schemagen ツール Javaのクラスから W3C XML Schemaを
XML文書の設計とスキーマ言語 • スキーマ言語 – XML文書のルールを定める DTD (document type definition) XML Schema W3C XML Schema RELAX NG Schematron
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>
JAXB • JAXB(Java architecture for XML Binding) • Java と XML とのマッピングを提供 • 新しい Webサービスを支える基礎技術 • アノテーションをフルに活用
Java と XML(1) • Java のクラスとインスタンス public class Name { String first; String last; } --------------------------------------------------- Name name = new Name(); name.first=“Tatsuo”; name.last=“Ueda”;
Java と XML(2) • XMLのドキュメント <nama> <first>Tatsuo</fist> <last>Ueda</last> </name> 要素<name> -- インスタンス name 要素<first>,<last> -- フィールドに対応
Java と XML(3) • インスタンスは個々の XML文書に対応 • クラスの定義は? • XML文書の定義はスキーマ言語 DTD(Document Type Definition) XML Schema W3C XML Schema RELAX NG Schematron
XML Schema の例(1) <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>
Java との比較(1) • String first; public String getFirst() { returen first; } public void setFirst( String s ) { first = s; } • <xsd:element name="first" type="xsd:string"/> • 基本は 「フィールド(プロパティ)要素」
Java との比較(2) • public class name { … } <xsd:element name="name“ type="nameType"/> <xsd:complexType name="nameType"> : • String first; String last; <xsd:sequence> <xsd:element name="first" type="xsd:string"/> <xsd:element name="last" type="xsd:string"/> </xsd:sequence>
XML Schema の例(2) <xsd:complexType name="peopleType"> <xsd:sequence> <xsd:element name="name" type="nameType" minOccurs="1" maxOccurs="unbounded"/> </xsd:sequence> </xsd:complexType>
対応のまとめ • Java言語 < -- > W3C XML Schema • Java のクラス < -- > スキーマ定義ファイル • Java のインスタンス < -- > XML文書 • Java のフィールド < -- > XMLの要素 (より正確にはプロパティ、属性のケースも)
新しい ツール xjc (1) • xjc ( XML to Java compiler ) • W3C XML Schema 定義ファイルを Java のクラス定義に xjc sample11.xsd
前回の実習: sample11.xsd <xsd:element name="people" type="peopleType"/> <xsd:complexType name="peopleType"> <xsd:sequence> <xsd:element name="name" type="nameType" maxOccurs="unbounded"/> </xsd:sequence> </xsd:complexType> => PeopleType.java に : :
前回の実習: sample11.xsd(2) <xsd:complexType name="nameType"> <xsd:sequence> <xsd:element name="first" type="xsd:string"/> <xsd:element name="middle" type="xsd:string" minOccurs="0"/> <xsd:element name="last" type="xsd:string"/> </xsd:sequence> </xsd:complexType> => NameType.java に
パッケージとディレクトリ • パッケージ( package) クラスのグループ分け、管理をしやすく • xjc デフォルトでは自動生成したクラスをgenerated というパッケージに • --+-- sampel11.xsd +-- generated --+-- PeopleType.java +-- NameType.java +-- ObjectFactory.java
NameType.java(1) package generated; import javax.xml.bind.annotation.XmlAccessType; import javax.xml.bind.annotation.XmlAccessorType; import javax.xml.bind.annotation.XmlElement; import javax.xml.bind.annotation.XmlType;
NameType.java(2) @XmlAccessorType(XmlAccessType.FIELD) @XmlType( name = "Name", propOrder ={ "first", "last" } ) public class NameType { : :
NameType.java(3) • 「プロパティ」とフィールド(3個) @XmlElement(required = true) protected String first; protected String middle; @XmlElement(required = true) protected String last;
NameType.java(4) • getter と setter も生成(3X2で計6個) public String getFirst() { return first; } public void setFirst( String value) { this.first = value; }
PeopleType.java • 複数のNameTypeを内部に持つ(setterなし) @XmlElement(required = true) protected List<NameType> name; : public List<NameType> getName() { if (name == null) name = new ArrayList<NameType>(); return this.name; }
setter のメソッドがない理由 • 内部のコレクションにデータ格納が可能 (コレクション自身を入れ替える必要なし) クラス People ListName
XML文書から Javaインスタンス <name> <first>Tatsuo</first> <last>Ueda</last> </name>
XML文書から Javaインスタンス import javax.xml.bind.*; import generated.*; : : JAXBContext jc = JAXBContext.newInstance( "generated" );
XML文書から Javaインスタンス Unmarshaller u = jc.createUnmarshaller(); JAXBElement element = (JAXBElement)u.unmarshal( new FileInputStream( "name.xml" ) ); Name name = (Name)element.getValue();
XML文書から Javaインスタンス String first = name.getFirst(); String last = name.getLast(); System.out.println( first + " " + last );
JavaインスタンスからXML文書 Name name = new Name(); String first = "Fujio"; String last = "Maruyama"; name.setFirst( first ); name.setLast( last );
JavaインスタンスからXML文書 JAXBElement element =new JAXBElement( new QName( "name" ), Name.class, name ); Marshaller m = jc.createMarshaller(); m.setProperty( Marshaller.JAXB_FORMATTED_OUTPUT, Boolean.TRUE );
Javaクラスからスキーマを生成 • ツール schemagen schemagen persen/*.java • サンプルでは person.Person.java , person.Name.java
後半の内容の予定 • XPath (6/15) • XSLT (6/22) • 名前空間(Namespace) (6/22) • XML文書の妥当性の検証(6/29) XML Schema • JAXB (7/6, 7/13) • SOAP, Webサービ(7/20) • 試験(7/27)