応用 Java (Java/XML)
-
Upload
fuller-santiago -
Category
Documents
-
view
54 -
download
3
description
Transcript of 応用 Java (Java/XML)
第12回 2007 年 7 月 13 日
「 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 SchemaJAXB (7/6, 7/13)SOAP, Web サービ (7/20)試験 (7/27)
JAXB Java と XML の変換のフレームワーク )
の続き javax.xml.bind パッケージ アプリケーション内で変換の実現 schemagen ツール Java のクラスから W3C XML
Schema を
スキーマ言語 – XML 文書のルールを定める DTD (document type definition) XML Schema W3C XML Schema RELAX NG Schematron
<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(Java architecture for XML Binding)
Java と XML とのマッピングを提供新しい Web サービスを支える基礎技術アノテーションをフルに活用
Java のクラスとインスタンス public class Name { String first; String last; }--------------------------------------------------- Name name = new Name(); name.first=“Tatsuo”;
name.last=“Ueda”;
XML のドキュメント <nama> <first>Tatsuo</fist> <last>Ueda</last> </name>
要素 <name> -- インスタンス name
要素 <first>,<last> -- フィールドに対応
インスタンスは個々の XML 文書に対応
クラスの定義は? XML 文書の定義はスキーマ言語 DTD(Document Type Definition) XML Schema W3C XML Schema RELAX NG Schematron
<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>
String first; public String getFirst() { returen first; } public void setFirst( String s ) { first = s;
} <xsd:element name="first" type="xsd:string"/>
基本は 「フィールド ( プロパティ ) 要素」
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>
<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 ( XML to Java compiler ) W3C XML Schema 定義ファイルを
Java のクラス定義に
xjc 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 に
: :
<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
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;
@XmlAccessorType(XmlAccessType.FIELD)
@XmlType( name = "Name", propOrder ={ "first",
"last" } ) public class NameType { : :
「プロパティ」とフィールド ( 3個 )
@XmlElement(required = true) protected String first;
protected String middle;
@XmlElement(required = true) protected String last;
getter と setter も生成 ( 3 X 2で計6個 )
public String getFirst() { return first; } public void setFirst( String value) { this.first = value; }
複数の NameType を内部に持つ (setter なし )
@XmlElement(required = true) protected List<NameType> name; : public List<NameType> getName() { if (name == null) name = new
ArrayList<NameType>(); return this.name; }
内部のコレクションにデータ格納が可能 ( コレクション自身を入れ替える必要なし )
クラス People List Name
<name> <first>Tatsuo</first> <last>Ueda</last> </name>
import javax.xml.bind.*; import generated.*; : :JAXBContext jc = JAXBContext.newInstance( "generated
" );
Unmarshaller u = jc.createUnmarshaller();
JAXBElement element = (JAXBElement)u.unmarshal( new
FileInputStream( "name.xml" ) ); Name name = (Name)element.getValue();
String first = name.getFirst(); String last = name.getLast(); System.out.println( first + " " + last );
Name name = new Name(); String first = "Fujio"; String last = "Maruyama"; name.setFirst( first ); name.setLast( last );
JAXBElement element =new JAXBElement( new
QName( "name" ), Name.class, name );Marshaller m = jc.createMarshaller(); m.setProperty( Marshaller.JAXB_FORMATTED_OUTPUT,
Boolean.TRUE );
ツール schemagen
schemagen persen/*.java
サンプルでは person.Person.java ,
person.Name.java
XPath (6/15)XSLT (6/22)名前空間 (Namespace) (6/22)XML 文書の妥当性の検証 (6/29) XML SchemaJAXB (7/6, 7/13)SOAP, Web サービ (7/20)試験 (7/27)