假期总结不能停,坚持坚持。。。。接下来总结一下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