加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

XML解析之SAX解析

发布时间:2020-12-16 02:16:26 所属栏目:百科 来源:网络整理
导读:import java.io.IOException; import java.io.InputStream; import java.util.List; import javax.xml.parsers.ParserConfigurationException; import javax.xml.parsers.SAXParser; import javax.xml.parsers.SAXParserFactory; import org.xml.sax.SAXExcep
import java.io.IOException;
import java.io.InputStream;
import java.util.List;
import javax.xml.parsers.ParserConfigurationException;
import javax.xml.parsers.SAXParser;
import javax.xml.parsers.SAXParserFactory;
import org.xml.sax.SAXException;


/**
*
* XML解析:
*
* SAX解析,基于事件的,按顺序解析
*
*
*/
public class XMLParserDemo {


public static void main(String[] args) {
try {
xmlSaxParser();
} catch (ParserConfigurationException | SAXException | IOException e) {
e.printStackTrace();
}
}


private static void xmlSaxParser() throws ParserConfigurationException,SAXException,IOException {
//1.获取一个sax解析器工厂
SAXParserFactory factory = SAXParserFactory.newInstance();
//2.获取一个sax解析器
SAXParser saxParser = factory.newSAXParser() ;
PersonHandler personHandler = new PersonHandler();

InputStream f = Thread.currentThread().getContextClassLoader().getResourceAsStream("person.xml");
//3.开始解析
saxParser.parse(f,personHandler);
List<Person> ps = personHandler.getPersons();
for (Person person : ps) {
System.out.println(person);
}
}


}

********************************************************************************************************************

PersonHandler类

import java.util.ArrayList;
import java.util.List;
import org.xml.sax.Attributes;
import org.xml.sax.SAXException;
import org.xml.sax.helpers.DefaultHandler;


public class PersonHandler extends DefaultHandler {

private List<Person> persons = null;
private Person currentPerson = null;

//解析到文档的开始
@Override
public void startDocument() throws SAXException {
super.startDocument();
System.out.println("startDocument()");
//创建集合存储数据
persons = new ArrayList<Person>();//准备工作
}


/**
* uri:命名空间
* localName:标签名,不带前缀
* qName:标签名(带前缀)
* attributes:属性的集合
*/
String qName =null;
@Override
public void startElement(String uri,String localName,String qName,Attributes attributes) throws SAXException {
super.startElement(uri,localName,qName,attributes);

System.out.println("startElement()");
if("person".equals(qName)){


currentPerson = new Person();//准备工作
currentPerson.setId(attributes.getValue("personid"));
}
this.qName =qName;
}

@Override

//注意:当读到一个标签的末尾时,会自动读后面的空格,直到下一行的开头,会覆盖之前读取的值,所以每次执行完characters()后,将qName置为空
public void characters(char[] ch,int start,int length) throws SAXException {
super.characters(ch,start,length);

System.out.println("characters()");
if("name".equals(qName)){
currentPerson.setName(new String(ch,length));
}else if("address".equals(qName)){
currentPerson.setAddress(new String(ch,length));
}else if("fax".equals(qName)){
currentPerson.setFax(new String(ch,length));
}else if("email".equals(qName)){
currentPerson.setEmail(new String(ch,length));
}
qName = null;
}


@Override
public void endElement(String uri,String qName) throws SAXException {
super.endElement(uri,qName);
System.out.println("endElement()");
if("person".equals(qName)){
persons.add(currentPerson);


}
}


@Override
public void endDocument() throws SAXException {
super.endDocument();
System.out.println("endDocument()");
System.out.println("文档解析完成!!!");
}


public List<Person> getPersons() {
return persons;
}




}

***********************************************************************************************************************

Person类//存对应的数据

public class Person {
private String id;
private String name;
private String address;
private String tel;
private String fax;
private String email;
public Person() {
super();
// TODO Auto-generated constructor stub
}
public Person(String id,String name,String address,String tel,String fax,String email) {
super();
this.id = id;
this.name = name;
this.address = address;
this.tel = tel;
this.fax = fax;
this.email = email;
}
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getAddress() {
return address;
}
public void setAddress(String address) {
this.address = address;
}
public String getTel() {
return tel;
}
public void setTel(String tel) {
this.tel = tel;
}
public String getFax() {
return fax;
}
public void setFax(String fax) {
this.fax = fax;
}
public String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
@Override
public String toString() {
return "Person [id=" + id + ",name=" + name + ",address=" + address + ",tel=" + tel + ",fax=" + fax
+ ",email=" + email + "]";
}


}


*********************************************************************************

person.xml文件

<?xml version="1.0" encoding="UTF-8"?>
<people>
<person personid="E01">
<name>Tony Blair</name>
<address>10 Downing Street,London,UK</address>
<tel>(061) 98765</tel>
<fax>(061) 98765</fax>
<email>blair@everywhere.com</email>
</person>
<person personid="E02">
<name>Bill Clinton</name>
<address>White House,USA</address>
<tel>(001) 6400 98765</tel>
<fax>(001) 6400 98765</fax>
<email>bill@everywhere.com</email>
</person>
<person personid="E03">
<name>Tom Cruise</name>
<address>57 Jumbo Street,New York,USA</address>
<tel>(001) 4500 67859</tel>
<fax>(001) 4500 67859</fax>
<email>cruise@everywhere.com</email>
</person>
<person personid="E04">
<name>Linda Goodman</name>
<address>78 Crax Lane,UK</address>
<tel>(061) 54 56789</tel>
<fax>(061) 54 56789</fax>
<email>linda@everywhere.com</email>
</person>
</people>

******************************************************************************************************************

执行结果

startDocument()//一开始进入文档
startElement()//<people>标签
characters()//</people>与下一行<person>之前的空白
startElement()//第一个<person>标签
characters()//<person>与<name>之间的内容+空白
startElement() //<name>标签
characters() //<name>与</name>之间的文字
endElement() //</name>标签

characters() //</name>与<address>之间的空白,下面依次类推
startElement()
characters()
endElement()

characters()
startElement()
characters()
endElement()

characters()
startElement()
characters()
endElement()

characters()
startElement()
characters()
endElement()

characters() //</email>与下一行</person>之间的空白
endElement() //</person>标签
characters() //</person>与下一行<person>之间的空白
startElement() //第二个<person>标签 characters() startElement() characters() endElement() characters() startElement() characters() endElement() characters() startElement() characters() endElement() characters() startElement() characters() endElement() characters() startElement() characters() endElement() characters() endElement() characters() startElement() characters() startElement() characters() endElement() characters() startElement() characters() endElement() characters() startElement() characters() endElement() characters() startElement() characters() endElement() characters() startElement() characters() endElement() characters() endElement() characters() startElement() characters() startElement() characters() endElement() characters() startElement() characters() endElement() characters() startElement() characters() endElement() characters() startElement() characters() endElement() characters() startElement() characters() endElement() characters() endElement() characters() endElement() endDocument() Person [id=E01,name=Tony Blair,address=10 Downing Street,UK,tel=null,fax=(061) 98765,email=blair@everywhere.com] Person [id=E02,name=Bill Clinton,address=White House,USA,fax=(001) 6400 98765,email=bill@everywhere.com] Person [id=E03,name=Tom Cruise,address=57 Jumbo Street,fax=(001) 4500 67859,email=cruise@everywhere.com] Person [id=E04,name=Linda Goodman,address=78 Crax Lane,fax=(061) 54 56789,email=linda@everywhere.com]

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读