用SAX解析XML實例
實例:以下輸出中的所有屬性和標簽值
package com.meixin.xml;
import java.io.File;
import java.util.HashMap;
import java.util.Vector;
import org.xml.sax.Attributes;
import org.xml.sax.SAXException;
import org.xml.sax.helpers.DefaultHandler;
import javax.xml.parsers.SAXParser;
import javax.xml.parsers.SAXParserFactory;
public class PraseXML extends DefaultHandler
{
private Vector<String> tagName;
private Vector<String> tagValue;
private int step;
// 開始解析XML文件
public void startDocument() throws SAXException
{
tagName = new Vector<String>();
tagValue = new Vector<String>();
step = 0;
}
// 結束解析XML文件
public void endDocument() throws SAXException
{
for (int i = 0; i < tagName.size(); i++)
{
if (!tagName.get(i).equals("") || tagName.get(i) != null)
{
System.out.println("節點名稱:" + tagName.get(i));
System.out.println("節點值:" + tagValue.get(i));
}
}
}
/**
* 在解釋到一個開始元素時會調用此方法.但是當元素有重復時可以自己寫算法來區分
* 這些重復的元素.qName是什么? <name:page ll=""></name:page>這樣寫就會拋出SAXException錯誤
* 通常情況下qName等于localName
*/
public void startElement(String uri, String localName, String qName,
Attributes attributes) throws SAXException
{
// 節點名稱
tagName.add(qName);
// 循環輸出屬性
for (int i = 0; i < attributes.getLength(); i++)
{
// 獲取屬性名稱
System.out.println("屬性名稱:" + attributes.getQName(i));
// 獲取屬性值
System.out.println("屬性值:"
+ attributes.getValue(attributes.getQName(i)));
}
}
/**
* 在遇到結束標簽時調用此方法
*/
public void endElement(String uri, String localName, String qName)
throws SAXException
{
step = step + 1;
}
/**
* 讀取標簽里的值,ch用來存放某行的xml的字符數據,包括標簽,初始大小是2048,
* 每解釋到新的字符會把它添加到char[]里。 * 注意,這個char字符會自己管理存儲的字符,
* 并不是每一行就會刷新一次char,start,length是由xml的元素數據確定的,
* 暫時找不到規律,以后看源代碼.
*
* 這里一個正標簽,反標簽都會被執行一次characters,所以在反標簽時不用獲得其中的值
*/
public void characters(char ch[], int start, int length)
throws SAXException
{
// 只要當前的標簽組的長度一至,值就不賦,則反標簽不被計劃在內
if (tagName.size() - 1 == tagValue.size())
{
tagValue.add(new String(ch, start, length));
}
}
public static void main(String[] args)
{
String filename = "MyXml.xml";
SAXParserFactory spf = SAXParserFactory.newInstance();
try
{
SAXParser saxParser = spf.newSAXParser();
saxParser.parse(new File(filename), new PraseXML());
}
catch (Exception e)
{
e.printStackTrace();
}
}
public Vector getTagName()
{
return tagName;
}
public void setTagName(Vector tagName)
{
this.tagName = tagName;
}
public Vector getTagValue()
{
return tagValue;
}
public void setTagValue(Vector tagValue)
{
this.tagValue = tagValue;
}
}
輸出結果:
屬性名稱:personid
屬性值:e01
屬性名稱:enable
屬性值:true
屬性名稱:personid
屬性值:e02
屬性名稱:enable
屬性值:false
屬性名稱:personid
屬性值:e03
屬性名稱:enable
屬性值:true
節點名稱:people
節點值:
節點名稱:person
節點值:
節點名稱:name
節點值:張三
節點名稱:tel
節點值:5128
節點名稱:email
節點值:txq512@sina.com
節點名稱:person
節點值:
節點名稱:name
節點值:meixin
節點名稱:tel
節點值:5252525
節點名稱:email
節點值:wnight88@sina.com
節點名稱:person
節點值:
節點名稱:name
節點值:yu
節點名稱:tel
節點值:5389654
節點名稱:email
節點值:yu@188.net
文件內容
<?xml version="1.0" encoding="UTF-8"?>
<people>
<person personid="e01" enable="true">
<name>張三</name>
<tel>5128</tel>
<email>txq512@sina.com</email>
</person>
<person personid="e02" enable="false">
<name>meixin</name>
<tel>5252525</tel>
<email>wnight88@sina.com</email>
</person>
<person personid="e03" enable="true">
<name>yu</name>
<tel>5389654</tel>
<email>yu@188.net</email>
</person>
</people>
http://wnight88.blog.51cto.com/512204/163197/
|