您的位置:首页 > 其它

XMl解析之—DOM解析与SAX解析

2016-07-02 19:46 344 查看
什么是XML(Extensible Markup Language 可扩展标记语言),xml是一个以文本来描述数据的文档

JAVA解析XML通常是两种方式,DOM和SAX
DOM:Document Object Model(文档对象模型)
DOM的特性:
定义一组java接口,基于对象,与语言和平台无关将xml文档表示为树,在内存中解析和定义XML文档,允许随机
访问文档的不同部分
DOM解析XML
DOM的优点,由于树在内存中是持久的,因此可以修改后更新。它还可以在任何时候在树中上下导航,API使用起来比较方便
常用于服务器


SAX是Simple API for XML的缩写

SAX是读取和操作xml数据更快,更轻量的方法。SAX允许在读取文档时就处理它,从而不必等整个文档被存储之后才来采取操作

。它不涉及DOM所必须得开销和概念跳跃。

SAX API是一个基于事件的API,适用于处理数据流,即随着数据的流动而依次处理数据

在其解析文档时发生一定事件的时候会通知开发者,当你对其相应时,不做保存的数据将会被抛弃

不占内存,灵活性差,顺序读取,速度快,适用于性能要求就高的设备上使用,如Android,不占内存

DOM解析示例:

public class DomParse {
static Person p=new Person();
//DOM解析XML
public static void main(String[] args) {
try {
DomPaseXml();
} catch (ParserConfigurationException e) {
e.printStackTrace();
}
}
private static void DomPaseXml() throws ParserConfigurationException {
try {
//创建builder
DocumentBuilderFactory builder=DocumentBuilderFactory.newInstance();
DocumentBuilder db = builder.newDocumentBuilder();
//解析路径
InputStream is=Thread.currentThread().getContextClassLoader()
.getResourceAsStream("day0702XmlDemo/Demo.xml");
Document doc = db.parse(is);
//从解析器中获取数据
//获取节点的列表
NodeList nl = doc.getElementsByTagName("person");
System.out.println(nl.getLength());
for(int j=0;j<nl.getLength();j++){
Node per = nl.item(j);
System.out.println(per.getNodeName());;
p.setPerson(per.getAttributes().getNamedItem("id").getNodeValue());
System.out.println(p.getPerson());
NodeList perlist = per.getChildNodes();
for(int l=0;l<perlist.getLength();l++){
Node pernode = perlist.item(l);
String nodeName = pernode.getNodeName();
if("name".equals(nodeName)){
p.setName(pernode.getFirstChild().getNodeValue());
}else if(nodeName.equals("age")){
p.setAge(Integer.parseInt(pernode.getFirstChild().getNodeValue()));
}else if(nodeName.equals("sex")){
p.setSex(pernode.getFirstChild().getNodeValue());
}else if(nodeName.equals("tel")){
p.setTel(Integer.parseInt(pernode.getFirstChild().getNodeValue()));
}
}
System.out.println(p.toString());
}
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}


SAX解析示例:

SAX解析需要一个DefaultHandler

public class PersonHandler extends DefaultHandler{

private List<Person> list;
Person p;
String tag;

public List<Person> getList() {
return list;
}

//开始解析文档
@Override
public void startDocument() throws SAXException {
// TODO Auto-generated method stub
super.startDocument();
list=new ArrayList<Person>();
System.out.println("开始解析文档啦");
}
//结束解析文档
@Override
public void endDocument() throws SAXException {
// TODO Auto-generated method stub
super.endDocument();
System.out.println("文档解析完毕");
}

//开始标签
@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(qName.equals("person")){
p=new Person();
p.setPerson(attributes.getValue("id"));
}
tag=qName;
}

//结束标签
@Override
public void endElement(String uri, String localName, String qName)
throws SAXException {
// TODO Auto-generated method stub
super.endElement(uri, localName, qName);
if("person".equals(qName)){
list.add(p);
}
tag=null;
}

//解析文档的(包括空格)
@Override
public void characters(char[] ch, int start, int length)
throws SAXException {
// TODO Auto-generated method stub
super.characters(ch, start, length);
if(tag!=null){
if("name".equals(tag)){
p.setName(new String(ch,start,length));
}else if("age".equals(tag)){
p.setAge(Integer.parseInt(new String(ch,start,length)));
}else if("sex".equals(tag)){
p.setSex(new String(ch,start,length));
}else if("tel".equals(tag)){
p.setTel(Integer.parseInt(new String(ch,start,length)));
}
}
}
}


然后是解析

public class SAXParse {
private static List<Person> list;
public static void main(String[] args) {
List<Person> saXpaseXml = SAXpaseXml();
for (Person person : saXpaseXml) {
System.out.println(person.toString());
}

}
private static List<Person> SAXpaseXml() {
try {
//创建解析器
SAXParserFactory factory=SAXParserFactory.newInstance();
SAXParser saxParser = factory.newSAXParser();
InputStream is=Thread.currentThread().getContextClassLoader()
.getResourceAsStream("day0702XmlDemo/Demo.xml");
PersonHandler dh=new PersonHandler();
saxParser.parse(is, dh);
list = dh.getList();
}  catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return list;
}
}


定义一个需要解析的类对象

public class Person {
String person;
String name;
int age;
String sex;
int tel;

public String getPerson() {
return person;
}

public void setPerson(String person) {
this.person = person;
}

public String getName() {
return name;
}

public void setName(String name) {
this.name = name;
}

public int getAge() {
return age;
}

public void setAge(int age) {
this.age = age;
}

public String getSex() {
return sex;
}

public void setSex(String sex) {
this.sex = sex;
}

public int getTel() {
return tel;
}

public void setTel(int tel) {
this.tel = tel;
}

public Person() {
super();
}

protected Person(String person, String name, int age, String sex, int tel) {
super();
this.person = person;
this.name = name;
this.age = age;
this.sex = sex;
this.tel = tel;
}

@Override
public String toString() {
return "Person [person=" + person + ", name=" + name + ", age=" + age
+ ", sex=" + sex + ", tel=" + tel + "]";
}

}


xml文件

<?xml version="1.0" encoding="utf-8"?>
<taiyuan>
<person id="1">
<name>小郭</name>
<age>23</age>
<sex>男</sex>
<tel>110</tel>
</person>
<person id="2">
<name>小王</name>
<age>20</age>
<sex>女</sex>
<tel>112</tel>
</person>

</taiyuan>
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: