続:JDeveloper で JAXB プログラミング
年末年始の休みを挟んじゃいましたが、今度は、複数のBookデータを格納できるようなコードにします。
まずは、複数データを保持できるXMLスキーマを作成し、それに対応するようにJavaコードも変えます。でも、基本的なプログラミング手順は前回と同じで、
です。コードが混じらないよう、新しいプロジェクトで作ります。
XMLスキーマの作成
前回と同じような手順で、XMLスキーマ・ダイアグラムを利用して、次のようなダイアグラムを作成します。
このコードは次のとおりです。
<?xml version="1.0" encoding="windows-31j" ?> <xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns="http://jkidd.com/book" targetNamespace="http://jkidd.com/book" elementFormDefault="qualified"> <xsd:element name="bookData"> <xsd:annotation> <xsd:documentation> A sample element </xsd:documentation> </xsd:annotation> <xsd:complexType> <xsd:sequence maxOccurs="unbounded"> <xsd:element name="book"> <xsd:complexType> <xsd:attribute name="price"/> <xsd:attribute name="title"/> </xsd:complexType> </xsd:element> </xsd:sequence> </xsd:complexType> </xsd:element> </xsd:schema>
JAX-B Compilerの実行
前回同様、book.xsdに対して、JAX-B Compilerを実行します。
パッケージ:com.jkidd.xml、テスト・クライアント: TestMain とします。
追加コーディング
今回は、テスト・クライアント・クラスのmainメソッドのtryブロック内を次のようにします。
context = JAXBContext.newInstance("com.jkidd.xml"); ObjectFactory factory = new ObjectFactory(); // 新規データの作成 BookData bookData = factory.createBookData(); BookDataType.Book book1 = factory.createBookDataTypeBook(); book1.setTitle("JAX-Bプログラミング"); book1.setPrice("12000"); BookDataType.Book book2 = factory.createBookDataTypeBook(); book2.setTitle("JAX-Bプログラミング応用編"); book2.setPrice("25000"); bookData.getBook().add(book1); bookData.getBook().add(book2); // データ書き出し用オブジェクト(マーシャラ)の用意 Marshaller marshaller = context.createMarshaller(); File file = new File("c:\\users\\test2.xml"); if (!file.exists()) file.createNewFile(); OutputStream out = new FileOutputStream( file ); //出力を整形する marshaller.setProperty( Marshaller.JAXB_FORMATTED_OUTPUT, Boolean.TRUE); // 書き出し marshaller.marshal(bookData, out);
これを実行すると、c:\users\test2.xml にデータが書き込まれます。今回は、XML書式を整形して出力するよう、ひとつプロパティを設定しています。
この2つの例のように、XML書き出しは Marshaller#marshal を使いますが、読み込みは、Ummarshaller#unmarshal を使用します。大体コードが想像できますよね!?