JAVA解析XML通常有两种方式:DOM和SAX
DOM: Document Object Model (文档对象模型)
DOM的特性:
定义一组Java接口,基于对象,与语言和平台无关将XML文档表示为树,在内存中解析和存储XML文档,允许随机访问文档的不同部分。
DOM解析XMLDOM的优点,由于树在内存中是持久的,因此可以修改后更新。它还可以在任何时候在树中上下导航,API使用起来也较简单。
解析步骤:
1、创建解析器工厂对象
DocumentBuilderFactory builder = DocumentBuilderFactory.newlnstance();
2、创建解析器对象
DocumentBuilder db = builder.newDocumentBuilder();
3、读取文件到内存
db.parse(" person.xml");
4、从内存中读取数据
NodeList node_ person = doc.getElementsByTagName("person");
特点:
基于树型结构,通过解析器一次性把文档加载到内存中,所以会比较占用内存,可以随机访问,更加灵活,更适合在web开发中使用。
代码示例:
package com.booy;
import org.junit.jupiter.api.Test;
import org.w3c.dom.Document;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
import org.xml.sax.SAXException;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;
import java.io.IOException;
import java.io.InputStream;
import java.lang.reflect.Array;
import java.util.ArrayList;
import java.util.Arrays;
public class DOMDemo {
@Test
public void domParser(){
//创建一个解析器工厂对象
DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
//创建一个解析器对象
try {
DocumentBuilder documentBuilder = dbf.newDocumentBuilder();
//解析文档
InputStream is = Thread.currentThread().getContextClassLoader().getResourceAsStream("com/booy/person.xml");
//将文档加载到内存中,以树状结构存储
Document doc = documentBuilder.parse(is);
//从内存中读取数据
NodeList personNodeList = doc.getElementsByTagName("person");
ArrayList<Person> persons = new ArrayList<>();
Person p;
for (int i = 0; i <personNodeList.getLength() ; i++) {
//取出集合里的对象
Node personNode = personNodeList.item(i);
p = new Person();
//获取属性集合的personid名称的值
String personid = personNode.getAttributes().getNamedItem("personid").getNodeValue();
p.setPersonid(personid);
//获取当前所有子节点,还是list集合
NodeList childNodes = personNode.getChildNodes();
for (int j = 0; j <childNodes.getLength() ; j++) {
Node node = childNodes.item(j);
//获取节点的名称
String nodeName = node.getNodeName();
if("name".equals(nodeName)){
p.setName(node.getFirstChild().getNodeValue());
}else if("address".equals(nodeName)){
p.setAddress(node.getFirstChild().getNodeValue());
}else if("tel".equals(nodeName)){
p.setTel(node.getFirstChild().getNodeValue());
}else if("fax".equals(nodeName)){
p.setFax(node.getFirstChild().getNodeValue());
}else if("email".equals(nodeName)){
p.setEmail(node.getFirstChild().getNodeValue());
}
}
persons.add(p);
}
System.out.println(Arrays.toString(persons.toArray()));
} catch (ParserConfigurationException e) {
e.printStackTrace();
} catch (SAXException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
}
对象数据类:
package com.booy;
public class Person {
private String personid;
private String name;
private String address;
private String tel;
private String fax;
private String email;
public String getPersonid() {
return personid;
}
public void setPersonid(String personid) {
this.personid = personid;
}
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{" +
"personid='" + personid + '\'' +
", name='" + name + '\'' +
", address='" + address + '\'' +
", tel='" + tel + '\'' +
", fax='" + fax + '\'' +
", email='" + email + '\'' +
'}';
}
}
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>
</people>
版权声明:本文为booy123原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。