解答例 - 実習課題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>