XML的三种解析方式

1.pull解析

import java.io.IOException;
import java.util.ArrayList;

import org.xmlpull.v1.XmlPullParser;
import org.xmlpull.v1.XmlPullParserException;

import android.app.Activity;
import android.os.Bundle;
import android.util.Log;
import android.util.Xml;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.ArrayAdapter;
import android.widget.Button;
import android.widget.ListView;
/**
 * 1.原理
 *   sax  ,以事件作为驱动进行文档的驱动
 *   handler-->  startDocument() startelement() end....  characters()
 * 2.pull  和sax类似
 *   获取eventType,事件类型--------》判断事件类型,根据不同的事件,做不同的事。
 * 3.josn和xml的优缺点
 *             优点                          缺点
 *  xml: 扩展性好,xml可以包含json.       结构复杂,解析麻烦
 *  json:结构简单,解析简单                 扩展性差
 */
public class MainActivity extends Activity {

    private Button bt;
	private ListView lv;
	private ArrayList
   
   
    
     list;
	private Person person;
	private int eventType;
	@Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        
        bt = (Button) findViewById(R.id.bt);
        lv = (ListView) findViewById(R.id.lv);
        bt.setOnClickListener(new OnClickListener() {
			
			

			@Override
			public void onClick(View v) {
			/*1.factory
			 *2.解析者
			 *3.解析 
			 */
				XmlPullParser pullParser = Xml.newPullParser();//获得解析者
				try {
					//pull解析者用输入流,解析文件
					pullParser.setInput(getAssets().open("source.xml"), "UTF-8");
					list = new ArrayList
    
    
     
     ();
					//获取事件类型
					eventType = pullParser.getEventType();
					//如果文档没有结束,就一直循环
					while(eventType!=XmlPullParser.END_DOCUMENT){//判断事件不是文档结束的时候
						Log.e("Tag","sart_DOCUMENT-----------------------");
						switch (eventType) {
						//判断xml节点名字
						case XmlPullParser.START_TAG://解析者开始标签 				
							//获取节点名字
							String name = pullParser.getName();
							if(name.equals("person")){
								person = new Person();//namespace  命名空间
								person.setId(pullParser.getAttributeValue(null, "id"));
							}else if (name.equals("name")) {
								//pullParser.nextText()获取名字,字符串(李明)
								person.setName(pullParser.nextText());
							}else if (name.equals("age")) {
								person.setAge(pullParser.nextText());
							}
							break;
						case XmlPullParser.END_TAG:
							//根据节点名字判断该节点是否结束,添加到集合
							String name2 = pullParser.getName();
							if(name2.equals("person")){
								list.add(person);
							}							
						break;
						}
						//当一个事件结束时,执行下一个事件
						eventType = pullParser.next();
					}
					for (int i = 0; i < list.size(); i++) {
						Log.e("Tag","name---"+list.get(i).getName());
					}
					//展示布局
					lv.setAdapter(new ArrayAdapter
     
     
      
      (MainActivity.this, android.R.layout.simple_list_item_1, list));					
				} catch (Exception e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				} 				
			}
		});
        
    }


    
}

     
     
    
    
   
   
2.SAX解析

import java.util.ArrayList;

import javax.xml.parsers.SAXParser;
import javax.xml.parsers.SAXParserFactory;

import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.widget.ArrayAdapter;
import android.widget.Button;
import android.widget.ListView;

public class MainActivity extends Activity {

    private Button bt;
	private ListView lv;
	@Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        
       bt = (Button) findViewById(R.id.bt);
       lv = (ListView) findViewById(R.id.lv);
        
        
    }
   public void saxPase(View v){
	
	  // 1.获取工厂类
	   SAXParserFactory factory = SAXParserFactory.newInstance();
	   SAXParser parser;
	try {
		// 2.获取具体解析者
		parser = factory.newSAXParser();
		// 3.解析/第一个参数:输入流。第二个参数:Handler.默认使用defaulHandler
		MyHandler handler = new MyHandler();
		parser.parse(getAssets().open("source.xml"), handler);
		//在这里创建集合什么用?
		ArrayList
   
   
    
     arrayList = handler.getPerson();
		lv.setAdapter(new ArrayAdapter
    
    
     
     (MainActivity.this, android.R.layout.simple_list_item_1,arrayList));
	} catch (Exception e) {
		// TODO Auto-generated catch block
		e.printStackTrace();
	} 
   }

   
}
    
    
   
   
import java.util.ArrayList;

import org.xml.sax.Attributes;
import org.xml.sax.SAXException;
import org.xml.sax.helpers.DefaultHandler;

import android.util.Log;

//具体的解析任务
public class MyHandler extends DefaultHandler{
	//变量
	private ArrayList
   
   
    
     list;
	private Person person;
	//自定义一个变量
	private String tem_tag;
	
	//供外部调用的方法
	public ArrayList
    
    
     
      getPerson(){
		
		return list;
	}
//需要重写5个方法
	@Override//开始解析文档的时候调用
	public void startDocument() throws SAXException {
		//开始文档的时候创建集合
		list=new ArrayList
     
     
      
      ();
		super.startDocument();
	}
	//结束文档时调用
	@Override
		public void endDocument() throws SAXException {
			//可以检验一下。集合中是否有person
		for (int i = 0; i < list.size(); i++) {
			Log.e("Tag", "--persons-"+list.get(i).getName());
		}
		}
	//开始解析到节点的时候调用-------localname,qname节点名字。  attributes属性
	@Override
		public void startElement(String uri, String localName, String qName,
				Attributes attributes) throws SAXException {
		//把每次解析的节点名,赋值给变量名
		tem_tag=localName;
			//判断节点名字
		if(localName.equals("person")){
		 person = new Person();
		 //通过属性,获得josn里的id
		 String value = attributes.getValue("id");
		 //通过属性的id给person类设置ID。
		 person.setId(Integer.parseInt(value));
		 
		}
			super.startElement(uri, localName, qName, attributes);
		}
	//节点结束时调用
	@Override
		public void endElement(String uri, String localName, String qName)
				throws SAXException {
		//判断,如果是person结束了。添加到集合
			if(localName.equals("person")){
				list.add(person);
			}
		}
	//拼接字符串
	@Override
		public void characters(char[] ch, int start, int length)
				throws SAXException {
		//拼接字符串
		String string=new String(ch,start,length);
			if(tem_tag.equals("name")){
				person.setName(string);
			}else if(tem_tag.equals("age")){
			person.setAge(string);	
			}
		}
}

     
     
    
    
   
   
import android.R.integer;

public class Person {
private String name;
private String age;
private int id;
public String getName() {
	return name;
}
public void setName(String name) {
	this.name = name;
}
public String getAge() {
	return age;
}
public void setAge(String age) {
	this.age = age;
}
public int getId() {
	return id;
}
public void setId(int id) {
	this.id = id;
}
@Override
public String toString() {
	return "Person [name=" + name + ", age=" + age + ", id=" + id + "]";
}

}

3.DOM解析

import java.util.ArrayList;

import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;

import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;

import android.R.integer;
import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.ArrayAdapter;
import android.widget.Button;
import android.widget.ListView;
import android.widget.Toast;

public class MainActivity extends Activity implements OnClickListener{
private ArrayList
   
   
    
     list;
private ListView lv;
private Button bt;
/**DOM解析是把整个xml文件都存入虚拟机
 * 第一步先把要解析的xml文件存入资源文件assets中
 */
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
		list = new ArrayList
    
    
     
     ();
		bt = (Button) findViewById(R.id.bt);
		lv = (ListView) findViewById(R.id.lv);
		
		bt.setOnClickListener(this);
		
		
	}
   //解析文档 1.先创建一个dom的解析工程类
	// DocumentBuilderFactory文档创建工厂类.newInstance()实例化一个
	public void onClick(View v) {
      DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
      try {
    	  //2.获得一个解析者  factory.newDocumentBuilder()
		DocumentBuilder builder = factory.newDocumentBuilder();
		//3.解析者去解析文档.--把xml文件解析成文档对象
		
		Document parse = builder.parse(getAssets().open("surce.xml"));
		//4.从文档对象中找节点,parse.getDocumentElement()  可以得到文档元素-->element
		Element element = parse.getDocumentElement();
		//5.获取person节点。element.getElementsByTagName("person") 通过标签名称获取节点
		NodeList nodeList = element.getElementsByTagName("person");//nodeList是一个类,里面包含很多person
		//遍历
		for (int i = 0; i < nodeList.getLength(); i++) {
			//找到一个person,就找到一个人
			Person person = new Person();
			//获取属性(这里把节点Node,转换成元素element)
			Element item = (Element) nodeList.item(i);//每一个元素,代表一个person
			//获取属性(获得的是string类型的id,转换成int类型)
			String attribute = item.getAttribute("id");
			//转换成int类型的id
			int parseInt = Integer.parseInt(attribute);//通过不同的Id查找子节点
			person.id=parseInt;
			
			
			//取出子节点
			NodeList childNodes = item.getChildNodes();
			//遍历子节点
			for (int j = 0; j < childNodes.getLength(); j++) {
	         //获取类型
				Node node = childNodes.item(j);
				short nodeType = node.getNodeType();//节点类型
				if(nodeType==Node.ELEMENT_NODE){//判断本节点类型,是否是本元素的节点类型Node.ELEMENT_NODE,而不会是其他的文本类型等
					//判断节点名称,是否是xml文件里的文件名称,相等
					if(node.getNodeName().equals("name")){
						//如果相等,就把xml文件里面的值,存进person对象里。
						String name1 = node.getFirstChild().getTextContent();//得到第一个子节点中的值getFirstChild()
						                                                      //得到里面的文本文档    getTextContent()
						//存入person对象中
						person.name=name1;
					}else if(node.getNodeName().equals("age")){
						//如果相等,就把xml文件里面的值,存进person对象里。
						String age1 = node.getFirstChild().getTextContent();//得到第一个子节点中的值getFirstChild()
						                                                      //得到里面的文本文档    getTextContent()
						//存入person对象中
						person.age=age1;
						
					}
				}
				
			}
			
			list.add(person);
			
		}
		//循环完成以后,再把他展示出来
		lv.setAdapter(new ArrayAdapter
     
     
      
      (MainActivity.this, android.R.layout.simple_list_item_1,android.R.id.text1, list));
	} catch (Exception e) {
		
		e.printStackTrace();
	}
      
	}

	
		
}

     
     
    
    
   
   

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值