|
根据这个xml文件,我们将Date Object设置如下。
/*
* Customers.java
* Create @ 2004-4-27 22:04:45
* by Jiabo
*/
import java.util.*;
/**
* Customers
* Create @ 2004-4-27 22:04:45
* by Jiabo
*/
public class Customers {
private Vector customers;
public Customers() {
customers = new Vector();
}
public void addCustomer(Customer customer) {
customers.add(customer);
}
public String toString() {
String newline = System.getProperty("line.separator");
StringBuffer buf = new StringBuffer();
for (int i = 0; i < customers.size(); i++) {
buf.append(customers.elementAt(i)).append(newline);
}
return buf.toString();
}
}
class Customer {
private String id;
private String name;
private String address;
/**
* @return
*/
public String getAddress() {
return address;
}
/**
* @return
*/
public String getId() {
return id;
}
/**
* @return
*/
public String getName() {
return name;
}
/**
* @param string
*/
public void setAddress(String string) {
address = string;
}
/**
* @param string
*/
public void setId(String string) {
id = string;
}
/**
* @param string
*/
public void setName(String string) {
name = string;
}
public String toString(){
return "Customer: ID=''''" + id + "'''' Name=''''" + name +
"'''' Address=''''" + address + "''''";
}
}
接下来是xml的处理器。
/*
* Test.java
* Created on 2004-4-10
* by Jiabo
*/
import java.util.*;
import org.xml.sax.*;
import org.xml.sax.helpers.DefaultHandler;
/**
* Test
* Create on 2004-4-10 19:20:27
* by Jiabo
*/
public class Unmarshaller extends DefaultHandler {
private Customers customers;
private Stack stack;
private boolean isStackReadyForText;
private Locator locator;
/**
* init
*/
public Unmarshaller() {
stack = new Stack();
isStackReadyForText = false;
}
/**
* @return customers
*/
public Customers getCustomers() {
return customers;
}
/**
* callbacks
*/
public void setDocumentLocator(Locator rhs) {
locator = rhs;
}
//==========================================
// SAX DocumentHandler methods
//==========================================
public void startElement(
String uri,
String sName,
String qName,
Attributes attrs) {
isStackReadyForText = false;
if (sName.equals("customers")) {
stack.push(new Customers());
} else if (sName.equals("customer")) {
stack.push(new Customer());
} else if (
sName.equals("id")
|| sName.equals("name")
|| sName.equals("address")) {
stack.push(new StringBuffer());
isStackReadyForText = true;
} else {
}
}
public void endElement(String namespaceURI, String sName, String qName){
isStackReadyForText = false;
Object temp = stack.pop();
if (sName.equals("customers")) {
customers = (Customers) temp;
} else if (sName.equals("customer")) {
((Customers) stack.peek()).addCustomer((Customer) temp);
} else if (sName.equals("id")) {
((Customer) stack.peek()).setId(temp.toString());
} else if (sName.equals("name")) {
((Customer) stack.peek()).setName(temp.toString());
} else if (sName.equals("address")) {
((Customer) stack.peek()).setAddress(temp.toString());
}
}
public void characters(char[] data, int start, int length) {
if (isStackReadyForText == true) {
((StringBuffer) stack.peek()).append(data, start, length);
} else {
}
}
}
在这里我们处理xml文件的思路非常简单,就是使用一个栈,遇到"<"表示element的开始,然后就看与我们既定的Data Object的名字是否相符合,符合就new一个该对象,并将其压栈;不符合就什么都不做,sax的处理框架就会自己去处理下一个element。而当遇到"/>"的时候我们还是看的他名字与DataObject的名字是否相符,相符合的话就出栈,然后set进对象里面。如此循环,就处理完了我们上面那个简单得xml文件。
我们需要做的事情就只有这些。其他如何处理的,handler回自己调用相应的startElement,endElement等方法去处理。
以下是程序的入口:
/*
* main.java
* Create @ 2004-4-27 22:18:41
* by Jiabo
*/
import java.io.*;
import javax.xml.parsers.*;
import org.xml.sax.*;
/**
* main
* Create @ 2004-4-27 22:18:41
* by Jiabo
*/
public class Main {
public static void main(String args[]) {
Customers customers = null;
if (args.length != 1) {
System.err.println("Usage: cmd filename");
System.exit(1);
}
try {
Unmarshaller handler = new Unmarshaller();
SAXParserFactory factory = SAXParserFactory.newInstance();
SAXParser saxParser = factory.newSAXParser();
File file = new File(args[0]);
InputSource src = new InputSource(new FileInputStream(file));
saxParser.parse( src ,handler);
customers = handler.getCustomers();
} catch (Throwable t) {
t.printStackTrace();
}
System.out.println(customers);
}
}
共3页: 上一页 [1] 2 [3] 下一页
|