在Java中有自帶的XML解析器,他是自上而下的,以流的方式進行解析的
例子以下,講XML轉化爲實體類java
所用到的實體類
public class Person {
String name;
int age;
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; }
@Override
public String toString() {
return "Person{" +
"name='" + name + '\'' +
", age=" + age +
'}';
}
}ide
XML文件:
<?xml version="1.0" encoding="UTF-8" ?>
<persons>
<person>
<name>至尊寶</name>
<age>10000</age>
</person>
<person>
<name>白晶晶</name>
<age>500</age>
</person>
</persons>this
解析類(乾貨就是這了): 這裏是繼承了org.xml.sax.helpers.DefaultHandler;類,重寫裏面的解析方法
import org.xml.sax.Attributes;
import org.xml.sax.SAXException;
import org.xml.sax.helpers.DefaultHandler;線程
import java.util.ArrayList;
import java.util.List;xml
public class PHander extends DefaultHandler {
List<Person> list;
Person person;
String tag;//存儲操做標籤
@Override
public void startDocument() throws SAXException {
list=new ArrayList<>();
}繼承
@Override
public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException {
System.out.println(qName+" +++解析文檔開始");
if (null != qName) {
tag=qName;
if (tag.equals("person")) {
person = new Person();
}
}
}文檔
@Override
public void characters(char[] ch, int start, int length) throws SAXException {
String str=new String(ch,start,length).trim();
if (null != tag && str.length() > 0) {
if (tag.equals("name")) {
person.setName(str);
}else if (tag.equals("age")) {
person.setAge(Integer.valueOf(str));
}
}
}get
@Override
public void endElement(String uri, String localName, String qName) throws SAXException {
if (null != qName && qName.equals("person")){
list.add(person);
}
tag=null;
System.out.println(qName+" +++解析文檔結束");
}io
@Override
public void endDocument() throws SAXException {
}class
public List<Person> getList() {
return list;
}
public void setList(List<Person> list) {
this.list = list;
}
}
用main方法跑着看一下:
public static void main(String[] args) throws Exception {
/**
* SAX解析
*/
//1 獲取解析工廠
SAXParserFactory factory=SAXParserFactory.newInstance();
//2從工廠獲取解析器
SAXParser parser=factory.newSAXParser();
//3加載文檔document註冊處理器
//4編寫處理器
PHander pHander=new PHander();
//5 解析;了 注意這裏加載XML文件的路徑他是從線程裏面加載的
parser.parse(Thread.currentThread().getContextClassLoader().getResourceAsStream("p.xml"),pHander);
//6 打印數據 System.out.println(pHander.getList().toString()); }