基本的な使い方
このページでは scalaxb
をインストールした後の基本的な使い方を説明する。(インストールがまだの人はセットアップを見てください)
走らせる
まず、XML Schema 定義ドキュメント,略して .xsd ファイルが必要だ。
ここでは以下の usaddress.xsd を使う:
<xs:schema targetNamespace="http://www.example.com/IPO"
elementFormDefault="qualified"
xmlns="http://www.example.com/IPO"
xmlns:xs="http://www.w3.org/2001/XMLSchema"
xmlns:ipo="http://www.example.com/IPO">
<xs:complexType name="Address">
<xs:sequence>
<xs:element name="name" type="xs:string"/>
<xs:element name="street" type="xs:string"/>
<xs:element name="city" type="xs:string"/>
</xs:sequence>
</xs:complexType>
<xs:complexType name="USAddress">
<xs:complexContent>
<xs:extension base="ipo:Address">
<xs:sequence>
<xs:element name="state" type="xs:string"/>
<xs:element name="zip" type="xs:positiveInteger"/>
</xs:sequence>
</xs:extension>
</xs:complexContent>
</xs:complexType>
</xs:schema>
次に,以下を走らせてほしい:
$ scalaxb usaddress.xsd -p ipo
-p ipo
でパッケージ名を指定する。scalaxb
は三つのソースを生成したはずだ。
複合型を表す case class を定義する usaddress.scala:
// Generated by <a href="http://scalaxb.org/">scalaxb</a>. package ipo trait Addressable { val name: String val street: String val city: String } case class Address(name: String, street: String, city: String) extends Addressable case class USAddress(name: String, street: String, city: String, state: String, zip: Int) extends Addressable
次に,trait XMLProtocol
に包まれた XML を case class に変換する型クラスのコントラクトとそのインスタンスを定義する xmlprotocol.scala。最後に、scalaxb
パッケージオブジェクトその他の補助クラスを定義する scalaxb.scala。
簡単なデモ
生成されたコードの使い方の一例:
val subject = <shipTo xmlns="http://www.example.com/IPO"> <name>Foo</name> <street>1537 Paper Street</street> <city>Wilmington</city> </shipTo> val shipTo = scalaxb.fromXML[ipo.Address](subject) val document = scalaxb.toXML[ipo.Address](shipTo.copy(name = "Bar"), None, Some("foo"), ipo.defaultScope)
REPL でこれを見てみよう:
scala> val subject = <shipTo xmlns="http://www.example.com/IPO">
<name>Foo</name>
<street>1537 Paper Street</street>
<city>Wilmington</city>
</shipTo>
subject: scala.xml.Elem =
<shipTo xmlns="http://www.example.com/IPO">
<name>Foo</name>
<street>1537 Paper Street</street>
<city>Wilmington</city>
</shipTo>
scala> val shipTo = scalaxb.fromXML[ipo.Address](subject)
shipTo: ipo.Address = Address(Foo,1537 Paper Street,Wilmington)
scala> val document = scalaxb.toXML[ipo.Address](shipTo.copy(name = "Bar"), None, Some("foo"), ipo.defaultScope)
document: scala.xml.NodeSeq = <foo xmlns="http://www.example.com/IPO" xmlns:ipo="http://www.example.com/IPO" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"><name>Bar</name><street>1537 Paper Street</street><city>Wilmington</city></foo>