java jdom解析xml文件_Java&Xml教程(六)使用JDOM解析XML文件

JDOM 提供了非常优秀的Java XML API来更方便的读取、修改、生成XML文档。JDOM还提供了包装类供用户从SAX、DOM、STAX事件解析、STAX流解析中选择具体的实现。

在本教程中,我们一起学习使用JDOM將读取XML文件信息,并转换为Java对象。

JDOM并非标准JDK的一部分,因此使用JDOM需要从官方网站中下载JDOM的二进制包,下载后將JDOM的Jar包添加到工程的classpath中即可。

JDOM提供了包装类供我们选择底层的XML解析API,它提供了四个重要的类,我们可以使用它获取JDOM的Document对象。JDOM Document对象提供非常有用的方法来获取根元素,子元素列表,属性值等。

JDOM的重要的类:

org.jdom2.input.DOMBuilder:使用DOM解析机制解析XML并将它转换为JDOM Document对象。

org.jdom2.input.SAXBuilder:使用SAX解析机制解析XML并转换为JDOM Document。

org.jdom2.input.StAXEventBuilder和org.jdom2.input.StAXStreamBuilder作用和前面两个类似,不再赘述。

org.jdom2.DocumentJDOM Document对象提供有用的方法获取根元素,读取或修改元素内容等操作,我们将要使用它获取XML的根元素。

org.jdom2.Document提供了有用的方法来获取子元素集合,获取子元素值,获取属性值等操作。

接下来我们开始使用案例程序读取XML文件并生成Java对象。

employees.xml

29

Pankaj

Male

Java Developer

35

Lisa

Female

CEO

40

Tom

Male

Manager

该xml文件存放员工信息,我们使用Employee类表示员工。

package com.journaldev.xml;

public class Employee {

private int id;

private String name;

private String gender;

private int age;

private String role;

public int getId() {

return id;

}

public void setId(int id) {

this.id = id;

}

public String getName() {

return name;

}

public void setName(String name) {

this.name = name;

}

public String getGender() {

return gender;

}

public void setGender(String gender) {

this.gender = gender;

}

public int getAge() {

return age;

}

public void setAge(int age) {

this.age = age;

}

public String getRole() {

return role;

}

public void setRole(String role) {

this.role = role;

}

@Override

public String toString() {

return "Employee:: ID="+this.id+" Name=" + this.name + " Age=" + this.age + " Gender=" + this.gender +

" Role=" + this.role;

}

}

接着在测试程序中使用DOMBuilder读取XML文件生成Employee对象集合。

JDOMXMLReader.java

package com.journaldev.xml.jdom;

import java.io.File;

import java.io.FileInputStream;

import java.io.FileNotFoundException;

import java.io.IOException;

import java.util.ArrayList;

import java.util.List;

import javax.xml.parsers.DocumentBuilder;

import javax.xml.parsers.DocumentBuilderFactory;

import javax.xml.parsers.ParserConfigurationException;

import javax.xml.stream.XMLEventReader;

import javax.xml.stream.XMLInputFactory;

import javax.xml.stream.XMLStreamException;

import javax.xml.stream.XMLStreamReader;

import org.jdom2.Element;

import org.jdom2.JDOMException;

import org.jdom2.input.DOMBuilder;

import org.jdom2.input.SAXBuilder;

import org.jdom2.input.StAXEventBuilder;

import org.jdom2.input.StAXStreamBuilder;

import org.w3c.dom.Document;

import org.xml.sax.SAXException;

import com.journaldev.xml.Employee;

public class JDOMXMLReader {

public static void main(String[] args) {

final String fileName = "/Users/pankaj/employees.xml";

org.jdom2.Document jdomDoc;

try {

//we can create JDOM Document from DOM, SAX and STAX Parser Builder classes

jdomDoc = useDOMParser(fileName);

Element root = jdomDoc.getRootElement();

List empListElements = root.getChildren("Employee");

List empList = new ArrayList<>();

for (Element empElement : empListElements) {

Employee emp = new Employee();

emp.setId(Integer.parseInt(empElement.getAttributeValue("id")));

emp.setAge(Integer.parseInt(empElement.getChildText("age")));

emp.setName(empElement.getChildText("name"));

emp.setRole(empElement.getChildText("role"));

emp.setGender(empElement.getChildText("gender"));

empList.add(emp);

}

//lets print Employees list information

for (Employee emp : empList)

System.out.println(emp);

} catch (Exception e) {

e.printStackTrace();

}

}

//Get JDOM document from DOM Parser

private static org.jdom2.Document useDOMParser(String fileName)

throws ParserConfigurationException, SAXException, IOException {

//creating DOM Document

DocumentBuilderFactory dbFactory = DocumentBuilderFactory.newInstance();

DocumentBuilder dBuilder;

dBuilder = dbFactory.newDocumentBuilder();

Document doc = dBuilder.parse(new File(fileName));

DOMBuilder domBuilder = new DOMBuilder();

return domBuilder.build(doc);

}

}

如你所见,这里我使用DOM解析包装类获取JDOM Document对象。

运行程序输出:

Employee:: ID=1 Name=Pankaj Age=29 Gender=Male Role=Java Developer

Employee:: ID=2 Name=Lisa Age=35 Gender=Female Role=CEO

Employee:: ID=3 Name=Tom Age=40 Gender=Male Role=Manager

我们同样可以使用SAX和STAX解析机制来完成,我们可以使用下面方法完成:

/Get JDOM document from SAX Parser

private static org.jdom2.Document useSAXParser(String fileName) throws JDOMException,

IOException {

SAXBuilder saxBuilder = new SAXBuilder();

return saxBuilder.build(new File(fileName));

}

//Get JDOM Document from STAX Stream Parser or STAX Event Parser

private static org.jdom2.Document useSTAXParser(String fileName, String type) throws FileNotFoundException, XMLStreamException, JDOMException{

if(type.equalsIgnoreCase("stream")){

StAXStreamBuilder staxBuilder = new StAXStreamBuilder();

XMLInputFactory xmlInputFactory = XMLInputFactory.newInstance();

XMLStreamReader xmlStreamReader = xmlInputFactory.createXMLStreamReader(new FileInputStream(fileName));

return staxBuilder.build(xmlStreamReader);

}

StAXEventBuilder staxBuilder = new StAXEventBuilder();

XMLInputFactory xmlInputFactory = XMLInputFactory.newInstance();

XMLEventReader xmlEventReader = xmlInputFactory.createXMLEventReader(new FileInputStream(fileName));

return staxBuilder.build(xmlEventReader);

}

运行程序将会得到相同的输出,因为我们只是使用不同的包装类,但是获取的JDOM Document对象相同。

使用JDOM的好处是我们可以很方便的切换底层的解析机制而处理代码不发生改变。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值