XML的JAVA 解析(一)(3) (轉)

gugu99發表於2008-04-26
XML的JAVA 解析(一)(3) (轉)[@more@]

一列簡單的
對於更加複雜的文件,我們需要對映一系列的物件到Java。對映一系列物件就像做酒吧服務生一樣:當一個服務生要倒滿一排啤酒時,他通常讓酒桶龍頭一直開著,他則只是訊速地把杯子依次接到龍頭下面。這正是我們捕獲一系列物件時所要做的。我們無法控制到來的SAX事件;它們就像不能關閉的龍頭裡流出來的啤酒一樣。為了解決問題,我們需要提供空的容器,讓它們充滿,不停的替換它們。microsoft-com::office" />

我們下一個例子說明這一技術。用一個XML文件表示一個虛擬的定購客戶,我們將把代表一系列定購商品的XML對映到一個Java的定購商品向量表中。實現這一想法的關鍵是“當前的商品”。每次我們得到一個事件表明一件新的定購商品(OrderItem標籤的startElement),我們就建立一個空的order-item物件,將它加入定購商品列表中,並以它為當前定購商品。餘下的工作由XML解析器完成。

首先,這裡有代表我們的虛擬顧客的XML文件:




 
  Bob
  Hustead
  abc.123
 

 
 
  1
  48.GH605A
  Pet Rock
  19.99
 

 
  12
  47.9906Z
  Bazooka Bubble Gum
  0.33
 

 
  2
  47.7879H
  Flourescent Orange Squirt Gun
  2.50
 

 

又是我們的簡單顧客類:


package common;

import java.io.*;


// Customer是一個包含一名虛擬顧客的屬性的簡單類。
// 它有一個簡單的方法把自已列印到一個列印流。

public class Customer {

 // Customer成員變數
  public String firstName = "";
  public String lastName = "";
  public String custId = "";

 public void print( PrintStream out ) {
 out.println( "Customer: " );
 out.println( " First Name -> " + firstName );
 out.println( " Last Name -> "  + lastName );
 out.println( " Customer Id -> " + custId );
  }

}

Next, a simple class to represent an order item:


package common;

import java.io.*;


// Customer是一個包含一名虛擬顧客的屬性的簡單類。
// 它有一個簡單的方法把自已列印到一個列印流。

public class OrderItem {

  // OrderItem member variables.
  public int quantity  = 0;
  public String productCode = "";
  public String description = "";
  public double price = 0.0;


 public void print( PrintStream out ) {
 out.println( "OrderItem: " );
 out.println( " Quantity -> " + Integer.toString(quantity) );
 out.println( " Product Code -> "  + productCode );
 out.println( " Description -> " + description );
 out.println( " price -> " + Double.toString( price ) );

  }

}

現在,我們把注意力轉移到SAX解析器例四,它將對映顧客和商品:


import org.xml.sax.*;
import org.xml.sax.helpers.*;
import java.io.*;
import java.util.*;
import common.*;

public class Example4 extends DefaultHandler {


 // 用於收集customer的XML資料的本地Customer變數
  private Customer cust = new Customer();

  // 定購物件的本地向量表...
  private Vector orderItems = new Vector();

  // 當前定購物件的本地引用...
  private OrderItem currentOrderItem;

 // 用於從"characters" SAX事件中收集資料的快取。
  private CharArrayWriter contents = new CharArrayWriter();



 // 過載DefaultHandler類以攔截SAX事件的方法。
  //
 // 頭於所有有效事件的詳細內容,參見org.xml.sax.ContentHandler。
  //

  public void startElement( String namespaceURI,
  String localName,
 String qName,
 Attributes attr ) throws SAXException {

 contents.reset();

 // 新新增的程式碼...
 if ( localName.equals( "OrderItem" ) ) {
  currentOrderItem = new OrderItem();
  orderItems.addElement( currentOrderItem );
 }

  }

  public void endElement( String namespaceURI,
  String localName,
 String qName ) throws SAXException {

 if ( localName.equals( "FirstName" ) ) {
  cust.firstName = contents.toString();
 }

 if ( localName.equals( "LastName" ) ) {
  cust.lastName = contents.toString();
 }

 if ( localName.equals( "CustId" ) ) {
  cust.custId = contents.toString();
 }

 if ( localName.equals( "Quantity" ) ) {
  currentOrderItem.quantity = Integer.valueOf(contents.toString().trim()).intValue();
 }

 if ( localName.equals( "ProductCode" ) ) {
  currentOrderItem.productCode = contents.toString();
 }

 if ( localName.equals( "Description" ) ) {
  currentOrderItem.description = contents.toString();
 }

 if ( localName.equals( "Price" ) ) {
  currentOrderItem.price = Double.valueOf(contents.toString().trim()).doubleValue();
 }


  }

  public void characters( char[] ch, int start, int length )
 throws SAXException {

  contents.write( ch, start, length );

  }


  public Customer getCustomer() {
  return cust;
  }

  public Vector getOrderItems() {
  return orderItems;
  }

  public static void main( String[] argv ){

 System.out.println( "Example4:" );
 try {

 // 建立SAX 2解析器...
  XMLReader xr = XMLReaderFactory.createXMLReader();

 // ContentHandler...
  Example4 ex4 = new Example4();
  xr.setContentHandler( ex4 );

 // 解析...
  xr.parse( new Input(
  new FileReader( "Example4.xml" )) );

 // 將customer顯示到標準輸出...
  Customer cust = ex4.getCustomer();
  cust.print( System.out );

  // 把所有的定購商品顯示到標準輸出...
  OrderItem i;
  Vector items = ex4.getOrderItems();
  Enumeration e = items.elements();
  while( e.hasMoreElements()){
  i = (OrderItem) e.nextElement();
 i.print( System.out );
  }


 }catch ( Exception e ) {
  e.printStackTrace();
 }


  }

}

這裡是我們的Customer與OrderItems物件產生的輸出:


Example4:
Customer:
 First Name -> Bob
 Last Name -> Hustead
 Customer Id -> abc.123
OrderItem:
 Quantity -> 1
 Product Code -> 48.GH605A
 Description -> Pet Rock
 price -> 19.99
OrderItem:
 Quantity -> 12
 Product Code -> 47.9906Z
 Description -> Bazooka Bubble Gum
 price -> 0.33
OrderItem:
 Quantity -> 2
 Product Code -> 47.7879H
 Description -> Fluorescent Orange Squirt Gun
 price -> 2.5

當XML文件的結構變得更復雜時,真正的因難是管理建立用於容納SAX 事件所產生的資料流的空物件。對於簡單的物件容器,這個管理工作並不複雜。但是,我們正是要開發一種複雜巢狀的容器,比方容器的容器和包含擁有容器成員物件的容器。

(未完待續)


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/10748419/viewspace-1003021/,如需轉載,請註明出處,否則將追究法律責任。

相關文章