java xml三种解析,Xml的三种解析方式

本文介绍了XML的三种解析方式:DOM、SAX和PULL解析。通过示例代码展示了如何在Android环境中使用这三种方法解析XML文件,包括DOM的一次性加载整个文档,SAX的事件驱动解析以及PULL解析的轻量级特性。代码中实现了从XML文件读取人员信息并存储到List中,并在UI上展示解析结果。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

XML的三种解析方式:DOM、SAX、PULL解析

废话不说上代码:package com.minimax.xmlparsedemo;

import java.io.InputStream;

import java.util.List;

import android.os.Bundle;

import android.app.Activity;

import android.content.res.AssetManager;

import android.util.Log;

import android.view.Menu;

import android.widget.TextView;

/**

* 这个例子讲述了XML的解析和生成

* 解析使用了四种方式

* 1.DOM解析

* 2.SAX解析

* 3.PULL解析

* 4.

* @author Administrator

*/

public class MainActivity extends Activity {

private AssetManager mAssess;

private InputStream is;

private DomXmlService mDomService;

private SaxXmlService mSaxService;

private PullXmlService mPullService;

private List persons;

private static final String TAG="domparse";

@Override

protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.activity_main);

TextView tv=(TextView) findViewById(R.id.tv);

try {

mAssess=getAssets();

is=mAssess.open("persons.xml");

//DOM解析

//mDomService=new DomXmlService();

//persons=mDomService.getPersonsByParseXML(is);

//SAX解析

//mSaxService=new SaxXmlService();

//persons=mSaxService.getPersonsByParseXML(is);

//PULL解析

mPullService=new PullXmlService();

persons=mPullService.getPersonsByParseXML(is);

//测试

String str="";

for(Person p:persons){

Log.i(TAG, p.toString());

str+=p.toString();

System.out.println("msg.."+p.toString());

}

tv.setText(str);

} catch (Exception e) {

// TODO: handle exception

e.printStackTrace();

}

}

@Override

public boolean onCreateOptionsMenu(Menu menu) {

// Inflate the menu; this adds items to the action bar if it is present.

getMenuInflater().inflate(R.menu.main, menu);

return true;

}

}

package com.minimax.xmlparsedemo;

public class Person {

public int id;

public int age;

public String name;

public int getId() {

return id;

}

public void setId(int id) {

this.id = id;

}

public int getAge() {

return age;

}

public void setAge(int age) {

this.age = age;

}

public String getName() {

return name;

}

public void setName(String name) {

this.name = name;

}

@Override

public String toString() {

return "Person [id=" + id + ", age=" + age + ", name=" + name + "]";

}

}

package com.minimax.xmlparsedemo;

import java.io.InputStream;

import java.util.List;

public interface IXmlService {

//因为三种方法都要去解析XML所以可以使三种方法都实现该接口即可

public List getPersonsByParseXML(InputStream in) throws Exception;

//创建出XML文档

public String getXMLDocumentByPersons(List persons);

}

package com.minimax.xmlparsedemo;

import java.io.InputStream;

import java.util.ArrayList;

import java.util.List;

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;

public class DomXmlService implements IXmlService {

@Override

public List getPersonsByParseXML(InputStream is) throws Exception {

// TODO Auto-generated method stub

List persons=null;

DocumentBuilderFactory factory=DocumentBuilderFactory.newInstance();

DocumentBuilder builder=factory.newDocumentBuilder();

Document document=builder.parse(is);

//获取的是根元素 persons

Element root=document.getDocumentElement();

// 得到一个集合,里面存放在XML文件中所有的person

NodeList nodelist=root.getElementsByTagName("person");

// 在这块判断集合是否为空 或者集合的元素个数为0

if(nodelist==null || nodelist.getLength()==0){

return null;

}

//初始化集合

persons=new ArrayList();

//生成List集合的数据

for(int i=0;i

Element node=(Element) nodelist.item(i);

Person p=new Person();

int id=Integer.parseInt(node.getAttribute("id"));

String name=getAttrText(node, "name");

String age=getAttrText(node, "age");

p.setAge(Integer.parseInt(age));

p.setName(name);

p.setId(id);

persons.add(p);

}

return persons;

}

public String getAttrText(Element element,String name){

String content=null;

//这个方法是获取person节点下面的所有节点

NodeList nodelist2=element.getChildNodes();

for(int k=0;k

Node node=nodelist2.item(k);

//获取节点的名称

String nodeName=node.getNodeName();

if(nodeName.equals(name)){

content=node.getTextContent();

}

}

return content;

}

@Override

public String getXMLDocumentByPersons(List persons) {

// TODO Auto-generated method stub

return null;

}

}

package com.minimax.xmlparsedemo;

import java.io.InputStream;

import java.util.ArrayList;

import java.util.List;

import javax.xml.parsers.SAXParser;

import javax.xml.parsers.SAXParserFactory;

import org.xml.sax.Attributes;

import org.xml.sax.SAXException;

import org.xml.sax.helpers.DefaultHandler;

/**

* 不必等到文档加载完毕之后才去解析,SAX解析直接进行解析

* @author Administrator

*

*/

public class SaxXmlService implements IXmlService {

@Override

public List getPersonsByParseXML(InputStream in) throws Exception {

// TODO Auto-generated method stub

SAXParserFactory factory=SAXParserFactory.newInstance();

SAXParser parser=factory.newSAXParser();

MySaxHandler dh=new MySaxHandler();

parser.parse(in, dh);

//返回解析之后生成的集合数据

return dh.getList();

}

//自定义一个Handler继承自DefaultHandler 然后重写其中的方法

class MySaxHandler extends DefaultHandler{

private  List persons;

private  String current;

private  Person person;

@Override

public void startDocument() throws SAXException {

// TODO Auto-generated method stub

super.startDocument();

persons=new ArrayList();

}

@Override

public void endDocument() throws SAXException {

// TODO Auto-generated method stub

super.endDocument();

}

@Override

public void startElement(String uri, String localName, String qName,

Attributes attributes) throws SAXException {

// TODO Auto-generated method stub

super.startElement(uri, localName, qName, attributes);

if("person".equals(localName)){

person=new Person();

person.setId(Integer.parseInt(attributes.getValue("id")));

}else if("name".equals(localName) || "age".equals(localName)){

current=localName;

}

}

@Override

public void endElement(String uri, String localName, String qName) throws SAXException {

super.endElement(uri, localName, qName);

if("person".equals(localName)){

persons.add(person);

}else if("name".equals(localName) || "age".equals(localName)){

current=null;

}

}

@Override

public void characters(char[] ch, int start, int length) throws SAXException {

super.characters(ch, start, length);

String s=new String(ch, start, length);

if("name".equals(current)){

person.setName(s);

}else if("age".equals(current)){

person.setAge(Integer.parseInt(s));

}

}

//返回persons

public List getList(){

return persons;

}

}

@Override

public String getXMLDocumentByPersons(List persons) {

// TODO Auto-generated method stub

return null;

}

}

package com.minimax.xmlparsedemo;

import java.io.InputStream;

import java.util.ArrayList;

import java.util.List;

import org.xmlpull.v1.XmlPullParser;

import org.xmlpull.v1.XmlPullParserFactory;

public class PullXmlService implements IXmlService {

@Override

public List getPersonsByParseXML(InputStream in) throws Exception {

List persons=null;

Person person=null;

XmlPullParserFactory factory=XmlPullParserFactory.newInstance();

XmlPullParser parser=factory.newPullParser();

parser.setInput(in, "utf-8");

int type=parser.getEventType();

while(type!=XmlPullParser.END_DOCUMENT){

String tagName=parser.getName();

switch (type) {

case XmlPullParser.START_DOCUMENT:

//创建集合

persons=new ArrayList();

break;

case XmlPullParser.START_TAG:

if("person".equals(tagName)){

person=new Person();

String id=parser.getAttributeValue(0);

person.setId(Integer.parseInt(id));

}else if("name".equals(tagName)){

person.setName(parser.nextText());

}else if("age".equals(tagName)){

person.setAge(Integer.parseInt(parser.nextText()));

}

break;

case XmlPullParser.END_TAG:

if("person".equals(tagName)){

persons.add(person);

person=null;

}

break;

default:

break;

}

type=parser.next();

}

return persons;

}

@Override

public String getXMLDocumentByPersons(List persons) {

// TODO Auto-generated method stub

return null;

}

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值