這裏用SAX 來解析:
SAX是採用一邊讀入數據一邊解析的方式,這樣可以很好的避免大文件解析的效率和性能問題(像什麼內存溢出之類的),但缺點就是插入不方便;
下面開始正題:
SAX 是讀取一個一個節點進行解析的, 如 :
<A>
<B>123</B>
<C>123</C>
</A>
<A>
<B>234</B>
</A>
SAX startElement 方法 會先讀取第一個A標籤,找到A標籤的時候 會調用 實現SAX 類的characters方法 來讀取其中的內容, 當讀取的內容遇到標籤的時候
又會調用startElement 方法,這樣周而復始,知道把A標籤解析完, 然後開始解析第二個A標籤……
執行順序爲:
(1)startDocument ---》(2)startElement ---》(3)characters ---》 (4)endElement ----》(5)endDocument
其中2-4 是可以被多步執行的;在startElement當中除了可以調用characters解析內容外 還可以從attributes裏面讀取屬性,
然後將值存入某個定義的變量中(如果有N個相同子元素子標籤的話, 要注意對每個子標籤值得轉存,以免數據被覆蓋)
/**
* @author lfssay
*這裏繼承DefaultHandler 就行了,實現ContentHandler要實現裏面所有的方法
*通常只需要5個方法就能完事兒
*
*在解析的過程中,如果是相同標籤的並列, 會一個一個去解析,標籤的內容也只是在解析完該標籤期間有效
*就是下面的定義標籤名稱,因爲在新的標籤解析當中, 如果有相同名稱標籤就會被覆蓋
*/
public class MyContentHandler extends DefaultHandler{
// 定義標籤名稱
String hisname,name,sex,status;
String tageName;
/**
* 開始解析document
*/
@Override
public void startDocument() throws SAXException {
// super.startDocument();
System.out.println("----begin the anlysis document----");
}
/**
* 結束解析document
*/
@Override
public void endDocument() throws SAXException {
// super.endDocument();
System.out.println("---end anlysis document----");
}
/**
* 開始解析標籤
* uri:命名空間
* localName:不帶前綴的標籤名
* qName:帶前綴的標籤名
* attributes:屬性
*/
@Override
public void startElement(String uri, String localName, String qName,
Attributes attributes) throws SAXException {
tageName = localName;
// 得到worker標籤的屬性值
if(localName.equals("worker")){
for(int i=0;i<attributes.getLength();i++){
System.out.println("===keyValues:"+attributes.getLocalName(i)+"---"+attributes.getValue(i));
}
}
// super.startElement(uri, localName, qName, attributes);
}
/**
* 結束解析標籤
*/
@Override
public void endElement(String uri, String localName, String qName)
throws SAXException {
if(localName.equals("worker")){
output();
}
// super.endElement(uri, localName, qName);
}
/**
* 得到標籤中間的內容
*/
@Override
public void characters(char[] ch, int start, int length)
throws SAXException {
if(tageName.equals("name")){
name = new String(ch,start,length);
}else if(tageName.equals("sex")){
sex = new String(ch,start,length);
}else if(tageName.equals("status")){
status = new String(ch,start,length);
}
// super.characters(ch, start, length);
}
public void output(){
System.out.println("name is --"+name);
System.out.println("sex is ---"+sex);
System.out.println("status is --"+status);
}
SAX實現類代碼如下,樣例: