詳解xml?
這裡首先明白什麼是SAX是一個用於處理XML事件驅動的“推”模型,優點是一種解析速度快並且佔用記憶體少的xml解析器,它需要哪些資料再載入和解析哪些內容。缺點是它不會記錄標籤的關係,而要讓你的應用程式自己處理,這樣就增加了你程式的負擔。DOM是一種文件物件模型,DOM可以以一種獨立於平臺和語言的方式訪問和修改一個文件的內容和結構。Dom技術使得使用者頁面可以動態地變化,如可以動態地顯示或隱藏一個元素,改變它們的屬性,增加一個元素等,Dom技術使得頁面的互動性大大地增強。缺點是DOM解析XML檔案時,會將XML檔案的所有內容以文件樹方式存放在記憶體中。
Pull解析和Sax解析很相似,Pull解析和Sax解析不一樣的地方是pull讀取xml檔案後觸發相應的事件呼叫方法返回的是數字還有pull可以在程式中控制想解析到哪裡就可以停止解析。
以penson.xml檔案為例:
第一種SAX 解析程式碼如下
public class SaxParseService extends DefaultHandler{
private List
private Penson mPenson = null;
private String m_preTag = null;
public List
SAXParser parser = factory.newSAXParser();
SaxParseService handler = new SaxParseService(); parser.parse(xmlStream, handler);
return handler.getPensons();
}
public List
return mPensons;
}
@Override
public void startDocument() throws SAXException {
mPensons = new ArrayList
}
@Override
public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException {
if("Penson".equals(qName)){
mPenson = new Penson(); mPenson.penId=Integer.parseInt(attributes.getValue(0));
}
m_preTag = qName;//將正在解析的節點名稱賦給preTag
}
@Override
public void endElement(String uri, String localName, String qName)throws SAXException {
if("Penson".equals(qName)){
mPensons.add(mPenson);
mPenson = null;
}
m_preTag = null;
}
@Override
public void characters(char[] ch, int start, int length) throws SAXException { if(m_preTag!=null){
try {
String content = new String(ch,start,length); if("name".equals(m_preTag)){
mPenson.name=content;
}else if("sex".equals(m_preTag)){
mPenson.sex=content;
}else if("age".equals(m_preTag)){ mPenson.age=Integer.parseInt(content);
} }catch(Exception e){} } }}
第二種PULL 解析程式碼如下:
public class PullParseService {
public static List
Penson mPenson = null;
XmlPullParser parser = Xml.newPullParser(); parser.setInput(inputStream, "UTF-8");
int event = parser.getEventType(); while(event!=XmlPullParser.END_DOCUMENT){
switch(event){
case XmlPullParser.START_DOCUMENT:
mPensons = new ArrayList
break;
case XmlPullParser.START_TAG: if("Penson".equals(parser.getName())){
mPenson = new Penson(); mPenson.penId=Integer.parseInt(parser.getAttributeValue(0)); } if(mPenson!=null){ if("name".equals(parser.getName())){ mPenson.name=parser.nextText();
}else if("sex".equals(parser.getName())){ mPenson.sex=parser.nextText();
}else if("age".equals(parser.getName())){ mPenson.age=Integer.parseInt(parser.nextText()); } } break;
case XmlPullParser.END_TAG: if("Penson".equals(parser.getName())){
mPensons.add(mPenson);
mPenson = null; } break; }
event = parser.next();
}
return mPensons; } }
第三種DOM 解析程式碼如下:
public class DomParseService {
public List
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); DocumentBuilder builder = factory.newDocumentBuilder();
Document document = builder.parse(inputStream);
Element element = document.getDocumentElement();
NodeList PensonNodes = element.getElementsByTagName("Penson");
for(int i=0;i
Element PensonElement = (Element) PensonNodes.item(i);
Penson mPenson = new Penson(); mPenson.penId=Integer.parseInt(PensonElement.getAttribute("id")); NodeList childNodes = PensonElement.getChildNodes();
for(int j=0;j
if("name".equals(childNodes.item(j).getNodeName())){
mPenson.name=childNodes.item(j).getFirstChild().getNodeValue(); }else if("sex".equals(childNodes.item(j).getNodeName())){ mPenson.sex=childNodes.item(j).getFirstChild().getNodeValue(); }else if("age".equals(childNodes.item(j).getNodeName())){ mPenson.age=Integer.parseInt(childNodes.item(j).getFirstChild().getNodeValue()); } } }
list.add(mPenson);
}
return list; }}
測試程式碼
public class MainActivity extends Activity implements OnClickListener{
private TextView mText;
@Override
protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mText=(TextView) findViewById(R.id.text); findViewById(R.id.btn_sax).setOnClickListener(this); findViewById(R.id.btn_pull).setOnClickListener(this); findViewById(R.id.btn_dom).setOnClickListener(this);
testSaxXml();
}
public void testSaxXml() {
try {
InputStream input=this.getResources().getAssets().open("peson.xml"); SaxParseService sax = new SaxParseService();
List
for(Penson mPenson : mPensons){
String text= "sax analyze:"+mPenson.toString(); mText.setText(text);
}
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
} }
public void testPullXml() {
try {
InputStream input=this.getResources().getAssets().open("peson.xml"); PullParseService pull = new PullParseService();
List
for(Penson mPenson : mPensons) {
String text= "pull analyze:"+mPenson.toString();
mText.setText(text);
} } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); } }
public void testDomXml() { try {
InputStream input=this.getResources().getAssets().open("peson.xml"); DomParseService dom = new DomParseService();
List
for(Penson mPenson : mPensons) {
String text= "dom analyze:"+mPenson.toString(); mText.setText(text);
} } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); } }
@Override
public void onClick(View v) {
switch (v.getId()) {
case R.id.btn_sax:
testSaxXml();
break;
case R.id.btn_pull:
testPullXml();
break;
case R.id.btn_dom:
testDomXml();
break; } }}
原始碼: