XML的JAVA 解析(一)(3) (轉)
一列簡單的
對於更加複雜的文件,我們需要對映一系列的物件到Java。對映一系列物件就像做酒吧服務生一樣:當一個服務生要倒滿一排啤酒時,他通常讓酒桶龍頭一直開著,他則只是訊速地把杯子依次接到龍頭下面。這正是我們捕獲一系列物件時所要做的。我們無法控制到來的SAX事件;它們就像不能關閉的龍頭裡流出來的啤酒一樣。為了解決問題,我們需要提供空的容器,讓它們充滿,不停的替換它們。microsoft-com::office" />
我們下一個例子說明這一技術。用一個XML文件表示一個虛擬的定購客戶,我們將把代表一系列定購商品的XML對映到一個Java的定購商品向量表中。實現這一想法的關鍵是“當前的商品”。每次我們得到一個事件表明一件新的定購商品(OrderItem標籤的startElement),我們就建立一個空的order-item物件,將它加入定購商品列表中,並以它為當前定購商品。餘下的工作由XML解析器完成。
首先,這裡有代表我們的虛擬顧客的XML文件:
又是我們的簡單顧客類:
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/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- XML的JAVA 解析(一)(1) (轉)XMLJava
- XML的JAVA 解析(一)(2) (轉)XMLJava
- XML的JAVA 解析(一)(4) (轉)XMLJava
- XML的JAVA 解析(一)(5) (轉)XMLJava
- 【Java】解析xmlJavaXML
- Java解析XMLJavaXML
- 用Java結合SAX 2.0 解析XML文件 (轉)JavaXML
- JAVA解析XML的四種方法JavaXML
- JAVA進行XML解析JavaXML
- java使用sax解析xmlJavaXML
- 用Python解析XML(3)PythonXML
- 使用 Java 解析XML檔案JavaXML
- Java中Dom解析xml文件JavaXML
- XML輕鬆學習手冊(3)XML概念之一(轉)XML
- 詳解Java解析XML的四種方法JavaXML
- XML入門指南(3)XML語法(轉)XML
- java的XML解析(DOM4J技術)JavaXML
- Java XML檔案解析書目錄JavaXML
- JAVA-使用SAX解析XML資料JavaXML
- Java XML程式設計例項解析JavaXML程式設計
- 使用PHP DOM-XML建立和解析XML檔案 (轉)PHPXML
- 使用Digester解析XML文件示例 (轉)XML
- Java 將HTML轉為XMLJavaHTMLXML
- Xml解析XML
- XML輕鬆學習手冊(6)XML例項解析(轉)XML
- IOS 學習之XML解析(一)iOSXML
- java 實現的XML schema 驗證(轉)JavaXML
- python 的xml解析PythonXML
- 解析帶字首的xmlXML
- java 物件與xml相互轉換Java物件XML
- java使用jaxb解析XML(含根據xml自動生成實體類)JavaXML
- Java DOM4J 方式解析XML檔案JavaXML
- iOS – XML解析iOSXML
- go 解析xmlGoXML
- xml php 解析XMLPHP
- iOS - XML解析iOSXML
- jaxb解析xmlXML
- DOM解析XMLXML