第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 Schema
 JAXB (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 も生成(3X2で計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 Schema
 JAXB (7/6, 7/13)
 SOAP, Webサービ(7/20)
 試験(7/27)


ダウンロード

Javaクラスからスキーマ