java解析XML文件的三种方法,配备注释解析。
举例要解析的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>
]

java解析XML文件一共有三种方式
首先我们先分析一下我们要解析的xml文件
People中有两个person,分别有name,address,tel,fax以及email。
我们解析的时候也要根据分类通过foreach来一步步解析。

首先我们要根据XML文件创建一个Person类
其中定义了XML文件中的标签
并且定义了属性的get set方法以及toString方法

package xml;

public class Person {
private String personid;
private String name;
private String address;
private String tel;
private String fax;
private String email;

@Override
public String toString() {
return "Person{" +
"personid='" + personid + '\'' +
", name='" + name + '\'' +
", address='" + address + '\'' +
", tel='" + tel + '\'' +
", fax='" + fax + '\'' +
", email='" + 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;
}
}



建立好了Person类我们开始实现三种解析xml文件的方式。

直接上代码,附带解析:

package xml;

import org.jdom2.Element;
import org.jdom2.JDOMException;
import org.jdom2.input.SAXBuilder;
import org.junit.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.*;
import java.io.IOException;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

public class XMLDemo {

//SAX解析XML文件
@Test
public void saxParseXML() throws ParserConfigurationException, SAXException, IOException {
//1、创建一个SAX解析器工厂对象
SAXParserFactory saxParserFactory = SAXParserFactory.newInstance();
//2、通过工厂对象创建SAX解析器
SAXParser saxParser = saxParserFactory.newSAXParser();
//3、创建一个数据处理器(需要我们自己编写)
PersonHandler personHandler = new PersonHandler();
//4、开始解析
InputStream is = Thread.currentThread().getContextClassLoader().getResourceAsStream("xml/person.xml");
saxParser.parse(is, personHandler);
List<Person> persons = personHandler.getPersons();
for (Person p : persons) {
System.out.println(p);
}
}




//DOM解析XML文件
/*
1、基于树形结构,通过解析器一次性把文档加载到内存中,所以占用内存较大,可以随机访问,更加灵活,更适合在web开发中使用
*/
@Test
public void domParseXML() throws ParserConfigurationException, IOException, SAXException {
//1、创建一个DOM解析器工厂对象
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
//2、通过工厂对象创建解析器对象
DocumentBuilder documentBuilder = factory.newDocumentBuilder();
//3、解析文档
InputStream is = Thread.currentThread().getContextClassLoader().getResourceAsStream("xml/person.xml");
Document doc = documentBuilder.parse(is);//此代码完成后,整个XML文档已经被加载到内存中,以树状形式存储
//4、从内存中读取数据
//从doc中获取数据,和xml没关系了,因为在上边代码完成后,xml文档已经被加载到内存中了
//获取节点名称为person的所有节点,返回节点集合
NodeList personNodeList = doc.getElementsByTagName("person");
ArrayList<Person> persons = new ArrayList<>();
Person p = null;
//此循环会迭代两次
for (int i = 0; i < personNodeList.getLength(); i++) {
Node personNode = personNodeList.item(i);
p = new Person();
//获取节点的属性值
String personid = personNode.getAttributes().getNamedItem("personid").getNodeValue();
p.setPersonid(personid);
//获取当前节点的所有子节点
NodeList childNodes = personNode.getChildNodes();
for (int j = 0; j < childNodes.getLength(); j++) {
Node item = childNodes.item(j);
String nodeName = item.getNodeName();
if("name".equals(nodeName)){
p.setName(item.getFirstChild().getNodeValue());
}else if("address".equals(nodeName)){
p.setAddress(item.getFirstChild().getNodeValue());
}else if("tel".equals(nodeName)){
p.setTel(item.getFirstChild().getNodeValue());
}else if("fax".equals(nodeName)){
p.setFax(item.getFirstChild().getNodeValue());
}else if("email".equals(nodeName)){
p.setEmail(item.getFirstChild().getNodeValue());
}
}
persons.add(p);
}
System.out.println("结果:");
System.out.println(Arrays.toString(persons.toArray()));
}



/*
1、jdom与DOM类似,基于树形结构
2、与DOM的区别:
a、第三方开源组件
b、实现使用java的Collections的接口
c、效率比DOM更快
*/
//jdom解析XML文件
@Test
public void jdomParseXML() throws JDOMException, IOException {
//创建JDOM解析器
SAXBuilder builder = new SAXBuilder();
InputStream is = Thread.currentThread().getContextClassLoader().getResourceAsStream("xml/person.xml");
org.jdom2.Document build = builder.build(is);
//获取根节点
Element rootElement = build.getRootElement();
List<Person> list = new ArrayList<>();
Person person = null;
List<Element> children = rootElement.getChildren();
for (Element element : children){
person = new Person();
String personid = element.getAttributeValue("personid");
person.setPersonid(personid);
List<Element> children1 = element.getChildren();
for (Element e : children1){
String tag = e.getName();
if("name".equals(tag)){
person.setName(e.getText());
}else if("address".equals(tag)){
person.setAddress(e.getText());
}else if("tel".equals(tag)){
person.setTel(e.getText());
}else if("fax".equals(tag)){
person.setFax(e.getText());
}else if("email".equals(tag)){
person.setEmail(e.getText());
}
}
list.add(person);
}
System.out.println("结果:");
System.out.println(Arrays.toString(list.toArray()));
}

}



其中第一种解析方式SAX解析XML文件需要以来我们的personHanlder

package xml;


import org.xml.sax.Attributes;
import org.xml.sax.SAXException;
import org.xml.sax.helpers.DefaultHandler;

import java.util.ArrayList;
import java.util.List;
/*
SAX解析的特点
1、基于事件驱动
2、顺序读取,速度快
3、不能任意读取节点(灵活性差)
4、解析时占用的内存小
5、SAX更适用于在性能要求更高的设备上使用(Android开发中)
*/
public class PersonHandler extends DefaultHandler {
private List<Person> persons = null;
private Person p;//当前正在解析的对象person
private String tag;//记录当前正在解析的标签名

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

//开始解析文档时调用
@Override
public void startDocument() throws SAXException {
super.startDocument();
persons = new ArrayList<>();
System.out.println("开始解析文档");
}

//在XML文档解析结束时调用
@Override
public void endDocument() throws SAXException {
super.endDocument();
System.out.println("解析文档结束");
}

/**
* //解析开始元素(标签)时调用
*
* @param uri 命名空间
* @param localName 不带前缀的标签名
* @param qName 带前缀的标签名
* @param attributes 当前标签的属性集合
* @throws SAXException
*/
@Override
public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException {
super.startElement(uri, localName, qName, attributes);
if ("person".equals(qName)) {
p = new Person();
String personid = attributes.getValue("personid");
p.setPersonid(personid);
}
tag = qName;
}

//解析结束元素(标签)时调用
@Override
public void endElement(String uri, String localName, String qName) throws SAXException {
super.endElement(uri, localName, qName);
if("person".equals(qName)){
persons.add(p);
}
tag = null;
}

//解析文本内容时调用
@Override
public void characters(char[] ch, int start, int length) throws SAXException {
super.characters(ch, start, length);
if ("name".equals(tag)) {
p.setName(new String(ch, start, length));
} else if ("address".equals(tag)){
p.setAddress(new String(ch, start, length));
}else if ("tel".equals(tag)){
p.setTel(new String(ch,start,length));
}else if("fax".equals(tag)){
p.setFax(new String(ch,start,length));
}else if("email".equals(tag)){
p.setEmail(new String(ch,start,length));
}
}
}

...全文
浏览 点赞 收藏 回复
写回复
回复

还没有回复,快来抢沙发~

发动态
发帖子
Java EE
创建于2007-09-28

3.7w+

社区成员

22.5w+

社区内容

J2EE只是Java企业应用。我们需要一个跨J2SE/WEB/EJB的微容器,保护我们的业务核心组件(中间件),以延续它的生命力,而不是依赖J2SE/J2EE版本。
社区公告
暂无公告