5.4.3 サンプルプログラム(SampleDOM.java)

サンプルプログラムを次に示します。

import java.io.*;
import javax.xml.parsers.*;
import javax.xml.transform.*;
import javax.xml.transform.dom.*;
import javax.xml.transform.stream.*;
import org.xml.sax.SAXException;
import org.w3c.dom.*;

public class SampleDOM
{
 public static final void main(String[] args)
 {
   try{
     new SampleDOM().CreateXMLFile();
     new SampleDOM().GetStringFromXML();
   }catch(Exception exception){
     exception.printStackTrace();
   }
 }

 //XMLファイルを作成する
 public final void CreateXMLFile()
 {
   try{
     DocumentBuilderFactory dbf =
         DocumentBuilderFactory.newInstance();
     DocumentBuilder db = dbf.newDocumentBuilder();

     Document doc = db.newDocument();
     Element parent = doc.createElement("伝票");

     Element sub = doc.createElement("商品");
     Element leaf1 = doc.createElement("商品名");
     Element leaf2 = doc.createElement("単価");
     Element leaf3 = doc.createElement("数量");
     leaf1.appendChild(doc.createTextNode("テレビ"));
     sub.appendChild(leaf1);
     leaf2.appendChild(doc.createTextNode("15000"));
     sub.appendChild(leaf2);
     leaf3.appendChild(doc.createTextNode("14"));
     sub.appendChild(leaf3);
     parent.appendChild(sub);

     sub = doc.createElement("商品");
     leaf1 = doc.createElement("商品名");
     leaf2 = doc.createElement("単価");
     leaf3 = doc.createElement("数量");
     leaf1.appendChild(doc.createTextNode("ラジオ"));
     sub.appendChild(leaf1);
     leaf2.appendChild(doc.createTextNode("3500"));
     sub.appendChild(leaf2);
     leaf3.appendChild(doc.createTextNode("6"));
     sub.appendChild(leaf3);
     parent.appendChild(sub);

     sub = doc.createElement("商品");
     leaf1 = doc.createElement("商品名");
     leaf2 = doc.createElement("単価");
     leaf3 = doc.createElement("数量");
     leaf1.appendChild(doc.createTextNode("ビデオ"));
     sub.appendChild(leaf1);
     leaf2.appendChild(doc.createTextNode("21000"));
     sub.appendChild(leaf2);
     leaf3.appendChild(doc.createTextNode("4"));
     sub.appendChild(leaf3);
     parent.appendChild(sub);

     doc.appendChild(parent);

     OutputStream os =
         new BufferedOutputStream(
         new FileOutputStream("SampleDOM.xml"));
     TransformerFactory tf =
         TransformerFactory.newInstance();
     Transformer tran = tf.newTransformer();
     tran.setOutputProperty("encoding", "Shift_JIS");
     tran.setOutputProperty("indent", "yes");
     tran.transform(new DOMSource(doc),
         new StreamResult(os));

     os.flush();
     os.close();

   }catch(ParserConfigurationException e){
     e.printStackTrace();
   }catch(TransformerConfigurationException e){
     e.printStackTrace();
   }catch(TransformerException e){
     e.printStackTrace();
   }catch(IOException e){
     e.printStackTrace();
   }
 }

 //CreateXMLFileで作成したXMLファイルからデータを取得して計算する
 public final void GetStringFromXML()
 {
   try{
     int tvPrice = 0;
     int radioPrice = 0;
     int videoPrice = 0;

     DocumentBuilderFactory factory =
         DocumentBuilderFactory.newInstance();
     DocumentBuilder builder = factory.newDocumentBuilder();

     Document doc = builder.parse("SampleDOM.xml");
     Element element1 = doc.getDocumentElement();
     NodeList nodelist1 = element1.getElementsByTagName("商品");

     //商品の数だけループをまわす
     for(int nShouhin = 0 ;
         nShouhin < nodelist1.getLength() ; nShouhin++){
       String str = new java.lang.String();
       int price = 0;
       int number = 0;
       Element element2 = (Element)nodelist1.item(nShouhin);

       //商品名の取得
       NodeList nodelist2 =
           element2.getElementsByTagName("商品名");
       Node node1 = nodelist2.item(0);
       if(node1.getNodeType() == Node.ELEMENT_NODE){
         Element element3 = (Element)node1;
         NodeList nodelist3 = element3.getChildNodes();
         Node node2 = nodelist3.item(0);
         str = node2.getNodeValue();
       }

       //商品名に対する単価の取得
       nodelist2 = element2.getElementsByTagName("単価");
       node1 = nodelist2.item(0);
       if(node1.getNodeType() == Node.ELEMENT_NODE){
         Element element3 = (Element)node1;
         NodeList nodelist3 = element3.getChildNodes();
         Node node2 = nodelist3.item(0);
         price = Integer.parseInt(node2.getNodeValue());
       }

       //商品名に対する数量の取得
       nodelist2 = element2.getElementsByTagName("数量");
       node1 = nodelist2.item(0);
       if(node1.getNodeType() == Node.ELEMENT_NODE){
         Element element3 = (Element)node1;
         NodeList nodelist3 = element3.getChildNodes();
         Node node2 = nodelist3.item(0);
         number = Integer.parseInt(node2.getNodeValue());
       }

       //各商品の小計を計算する
       if(str.equals("テレビ")){
         tvPrice = price * number;
       }else if(str.equals("ラジオ")){
         radioPrice = price * number;
       }else if(str.equals("ビデオ")){
         videoPrice = price * number;
       }
     }
     int sum = tvPrice + radioPrice + videoPrice;
     System.out.println("合計は" + sum + "円です。");
   }catch(ParserConfigurationException e){
     e.printStackTrace();
   }catch(SAXException e){
     e.printStackTrace();
   }catch(IOException e){
     e.printStackTrace();
   }
 }
}