假期總結不能停,堅持堅持。。。。接下來總結一下XMl和json的解析和生成。。
解析XML的四種方法,即:DOM、SAX、JDOM和DOM4J
下面首先給出這四種方法的jar包下載地址:
DOM:在現在的Java JDK里都自帶了,在xml-apis.jar包里
SAX:http://sourceforge.net/projects/sax/
JDOM:http://jdom.org/downloads/index.html
DOM4J:http://sourceforge.net/projects/dom4j/
現編開始一一介紹:
SAX:也是我第一個學的方法。。。
SAX是一種解析速度快並且占用內存少的XML解析器,非常適用於Android的移動設備。
SAX采用事件驅動`,也就是說,它並不是需要解析完整的文檔,在按內容順序解析文檔的過程中,Sax會判斷當前讀到的字符是否符合XMl語法的某部分,如果符合就會觸發事件。
所謂事件,其實就是一些回掉方法,這些事件定義在GefaultHandler中。
解析過程:
(1)創建SAX解析器
SAXParserFactory factory=SAXParserFactory.newInstance();
//reader對象,從解析器得到reader
XMLReader reader = factory.newSAXParser().getXMLReader();
(2)實現解析DefaultHandler
主要實現其中的4個方法:
Void startDocument(), void endDocument(), void startElement(String uri,String localName,string qName,Attributes attr).
Void endElement(String uri,String localName,string qName)
android示例代碼:
package com.example.xmltest;
import java.text.AttributedCharacterIterator.Attribute;
import org.xml.sax.Attributes;
import org.xml.sax.SAXException;
import org.xml.sax.helpers.DefaultHandler;
//缺省實現所有處理器接口的幫助類DefaultHandler
public class MyContentHandler extends DefaultHandler{
String hisname,address,money,sex,status;
String tagName;
/**
* @param args
*/
public void startDocument() throws SAXException{
System.out.println("、、、、begin、、、、");
}
public void endDocument() throws SAXException{
System.out.println("、、、、end、、、、");
}
//QName(Qualified Name 限定?指定?名稱)
//sina:blog就是QName,相當於前綴+":"+LocalName,LocalName是blog。
//Attributes得到標簽的屬性,一個標簽可以有多個屬性<worker id="AD002">中id就是屬性
public void startElement(String namespaceURI, String localName
,String qName, Attributes attr) throws SAXException{
tagName = localName;
System.out.println("tagName:"+tagName);
//localName 屬性返回被選元素的本地名稱(元素名稱)。
//如果選定的節點不是元素或屬性,則該屬性返回 NULL
if(localName.equals("worker")){
//獲取標簽的全部屬性
for(int i = 0;i < attr.getLength();i++){
System.out.println(attr.getLocalName(i)+"="+attr.getValue(i));
}
//getLocalName(i)得到是id getValue(i)得到的是后邊的值
}
}
//namespaceURI命名空間,得到當前正在解析的標簽的命名空間,用於區分標簽;localname不帶前綴,qname帶前綴
public void endElement(String namespaceURI, String localName,String qName)
throws SAXException{
//獲取標簽的全部屬性
if(localName.equals("worker")){
this.printout(); //全部輸出
}
tagName="";
}
//得到值,tagName在startElement中已經是標簽名啦。。。
public void characters(char[] ch,int start,int length)throws SAXException{
if(tagName.equals("name"))
hisname = new String(ch,start,length).trim();
else if(tagName.equals("sex"))
sex = new String(ch,start,length).trim();
else if(tagName.equals("status"))
status = new String(ch,start,length).trim();
else if(tagName.equals("address"))
address = new String(ch,start,length).trim();
else if(tagName.equals("money")){
money = new String(ch,start,length).trim();
}
}
private void printout(){
System.out.print("name: ");
System.out.println(hisname);
System.out.print("sex: ");
System.out.println(sex);
System.out.println("cdv");
System.out.print("status: ");
System.out.println(status);
System.out.print("address: ");
System.out.println(address);
System.out.print("money: ");
System.out.println(money);
System.out.println();
}
}
下邊是Activity的代碼:
package com.example.xmltest;
import java.io.StringReader;
import javax.xml.parsers.SAXParserFactory;
import org.xml.sax.ContentHandler;
import org.xml.sax.InputSource;
import org.xml.sax.XMLReader;
import com.example.utils.HttpDownloader;
import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
//對應的文件在D:\tomcat-6.0.43\webapps\voal
public class XMLActivity extends Activity {
private Button parsebutton;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_xml);
parsebutton = (Button)findViewById(R.id.parsebutton);
parsebutton.setOnClickListener(new ParseButtonListener());
}
/**
* 住線程中不能申請網絡服務!!!!另起線程
* @author 超超boy
*/
class ParseButtonListener implements OnClickListener{
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
System.out.println("啟動線程");
new Thread(new Down()).start();
}
}
class Down implements Runnable{
@Override
public void run() {
// TODO Auto-generated method stub
HttpDownloader hd = new HttpDownloader();
//resultStr返回的是文件內容
String resultStr = hd.download("http://192.168.253.1:8088/voal/test.xml");
//這個是自己搭建的服務器中的文件
System.out.println(resultStr);
try{
//創建一個SAXParserFactory解析器工程
SAXParserFactory factory = SAXParserFactory.newInstance();
//reader對象,從解析器得到reader
XMLReader reader = factory.newSAXParser().getXMLReader();
//為xmlreader設置內容處理器,逐行掃描,調用函數,要調用的函數就在MyContentHandler實現類中
reader.setContentHandler(new MyContentHandler());
//開始解析文件
System.out.println("開始解析");
reader.parse(new InputSource(new StringReader(resultStr)));
}catch(Exception e){
e.printStackTrace();
}
}
}
}
解析的原文件:
<?xml version="1.0" encoding="UTF-8"?>
<workers>
<worker id="AQ01">
<name>Jery</name>
<sex>女</sex>
<status>經理</status>
<address>北京</address>
<money>4000</money>
</worker>
<worker id="AD02">
<name>Lili</name>
<sex>女</sex>
<status>總監</status>
<address>青島</address>
<money>40000</money>
</worker>
<worker id="AD03">
<name>ChaoCaho</name>
<sex>男</sex>
<status>董事長</status>
<address>青島</address>
<money>400000</money>
</worker>
</workers>
轉載請注明出處:http://www.cnblogs.com/jycboy/p/saxparxml.html
