基本的な使い方

このページでは 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>