解答例 - 実習課題1 - 10.JAXB(2)
(実習課題1)
商品情報を表すXML文書を読み込み、価格が最も高い商品の情報を表示するコンソールプログラムを作成しなさい。例えば、以下のようなXML文書があったとします。
product.xml
<?xml version="1.0"?>
<products>
<product>
<name>ゼロからはじめるJava</name>
<price>1905</price>
</product>
<product>
<name>ゼロからはじめるJ2EE</name>
<price>2095</price>
</product>
</products>
プログラムを実行すると以下のように表示されます。
$java MostExpensiveProduct product.xml product.xmlの商品の中で最も高価な商品は、「ゼロからはじめるJ2EE」、価格は2095円です。
前章の実習課題で作成したスキーマやJAXBにより自動生成したクラス(Products、Product...)を使用しなさい。また、XML文書を読み込む場合には妥当性を検証し、妥当でない場合はエラーメッセージを出力しなさい。
解答例
/**
* MostExpensiveProduct.java
*
* TECHSCORE Java XML DOM XSLT 10章 実習課題1
*
* Copyright (c) 2004 Four-Dimensional Data, Inc.
*/
package com.techscore.dom.chapter10.exercise1;
import java.io.File;
import java.util.List;
import javax.xml.bind.JAXBContext;
import javax.xml.bind.JAXBException;
import javax.xml.bind.Unmarshaller;
import com.techscore.dom.jaxb.Product;
import com.techscore.dom.jaxb.Products;
public class MostExpensiveProduct {
public static void main(String[] args) {
try {
JAXBContext jc = JAXBContext.newInstance("com.techscore.dom.jaxb");
Unmarshaller unmarshaller = jc.createUnmarshaller();
unmarshaller.setValidating(true);
Products products = (Products) unmarshaller.unmarshal(new File(args[0]));
List productList = products.getProduct();
int max_price = 0;
int product_id = 0;
for (int i = 0; i < productList.size(); i++) {
Product product = (Product) productList.get(i);
if (max_price < Integer.parseInt(product.getPrice())) {
max_price = Integer.parseInt(product.getPrice());
product_id = i;
}
}
System.out.println(args[0] + "の商品の中でもっとも高価な商品は「"
+ ((Product) productList.get(product_id)).getName()
+ "」、価格は" + max_price + "円です。");
} catch (JAXBException e) {
System.err.println("指定されたXML文書は妥当ではありません。");
}
}
}
▼product.xml
<?xml version="1.0" encoding="EUC-JP"?>
<products>
<product>
<name>ゼロからはじめるJava</name>
<price>1905</price>
</product>
<product>
<name>ゼロからはじめるJ2EE</name>
<price>2095</price>
</product>
</products>

