这篇文章将为大家详细讲解有关如何使用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.Document
JDOM Document对象提供有用的方法获取根元素,读取或修改元素内容等操作,我们将要使用它获取XML的根元素。 org.jdom2.Document
提供了有用的方法来获取子元素集合,获取子元素值,获取属性值等操作。
接下来我们开始使用案例程序读取XML文件并生成Java对象。
employees.xml
<?xml version="1.0" encoding="UTF-8"?><Employees> <Employee id="1"> <age>29</age> <name>Pankaj</name> <gender>Male</gender> <role>Java Developer</role> </Employee> <Employee id="2"> <age>35</age> <name>Lisa</name> <gender>Female</gender> <role>CEO</role> </Employee> <Employee id="3"> <age>40</age> <name>Tom</name> <gender>Male</gender> <role>Manager</role> </Employee></Employees>
该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 setIdint id) { this.id = id; } public String getName) { return name; } public void setNameString name) { this.name = name; } public String getGender) { return gender; } public void setGenderString gender) { this.gender = gender; } public int getAge) { return age; } public void setAgeint age) { this.age = age; } public String getRole) { return role; } public void setRoleString 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 mainString[] 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 = useDOMParserfileName); Element root = jdomDoc.getRootElement); List<Element> empListElements = root.getChildren"Employee"); List<Employee> empList = new ArrayList<>); for Element empElement : empListElements) { Employee emp = new Employee); emp.setIdInteger.parseIntempElement.getAttributeValue"id"))); emp.setAgeInteger.parseIntempElement.getChildText"age"))); emp.setNameempElement.getChildText"name")); emp.setRoleempElement.getChildText"role")); emp.setGenderempElement.getChildText"gender")); empList.addemp); } //lets print Employees list information for Employee emp : empList) System.out.printlnemp); } catch Exception e) { e.printStackTrace); } } //Get JDOM document from DOM Parser private static org.jdom2.Document useDOMParserString fileName) throws ParserConfigurationException, SAXException, IOException { //creating DOM Document DocumentBuilderFactory dbFactory = DocumentBuilderFactory.newInstance); DocumentBuilder dBuilder; dBuilder = dbFactory.newDocumentBuilder); Document doc = dBuilder.parsenew FilefileName)); DOMBuilder domBuilder = new DOMBuilder); return domBuilder.builddoc); } }
如你所见,这里我使用DOM解析包装类获取JDOM Document对象。
运行程序输出:
Employee:: ID=1 Name=Pankaj Age=29 Gender=Male Role=Java DeveloperEmployee:: ID=2 Name=Lisa Age=35 Gender=Female Role=CEOEmployee:: ID=3 Name=Tom Age=40 Gender=Male Role=Manager
我们同样可以使用SAX和STAX解析机制来完成,我们可以使用下面方法完成:
/Get JDOM document from SAX Parserprivate static org.jdom2.Document useSAXParserString fileName) throws JDOMException, IOException { SAXBuilder saxBuilder = new SAXBuilder); return saxBuilder.buildnew FilefileName)); } //Get JDOM Document from STAX Stream Parser or STAX Event Parserprivate static org.jdom2. Document useSTAXParserString fileName, String type) throws FileNotFoundException, XMLStreamException, JDOMException{ iftype.equalsIgnoreCase"stream")){ StAXStreamBuilder staxBuilder = new StAXStreamBuilder); XMLInputFactory xmlInputFactory = XMLInputFactory.newInstance); XMLStreamReader xmlStreamReader = xmlInputFactory.createXMLStreamReadernew FileInputStreamfileName)); return staxBuilder.buildxmlStreamReader); } StAXEventBuilder staxBuilder = new StAXEventBuilder); XMLInputFactory xmlInputFactory = XMLInputFactory.newInstance); XMLEventReader xmlEventReader = xmlInputFactory.createXMLEventReadernew FileInputStreamfileName)); return staxBuilder.buildxmlEventReader); }
运行程序将会得到相同的输出,因为我们只是使用不同的包装类,但是获取的JDOM Document对象相同。
使用JDOM的好处是我们可以很方便的切换底层的解析机制而处理代码不发生改变。
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.Document
JDOM Document对象提供有用的方法获取根元素,读取或修改元素内容等操作,我们将要使用它获取XML的根元素。 org.jdom2.Document
提供了有用的方法来获取子元素集合,获取子元素值,获取属性值等操作。
接下来我们开始使用案例程序读取XML文件并生成Java对象。
employees.xml
<?xml version="1.0" encoding="UTF-8"?><Employees> <Employee id="1"> <age>29</age> <name>Pankaj</name> <gender>Male</gender> <role>Java Developer</role> </Employee> <Employee id="2"> <age>35</age> <name>Lisa</name> <gender>Female</gender> <role>CEO</role> </Employee> <Employee id="3"> <age>40</age> <name>Tom</name> <gender>Male</gender> <role>Manager</role> </Employee></Employees>
该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 setIdint id) { this.id = id; } public String getName) { return name; } public void setNameString name) { this.name = name; } public String getGender) { return gender; } public void setGenderString gender) { this.gender = gender; } public int getAge) { return age; } public void setAgeint age) { this.age = age; } public String getRole) { return role; } public void setRoleString 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 mainString[] 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 = useDOMParserfileName); Element root = jdomDoc.getRootElement); List<Element> empListElements = root.getChildren"Employee"); List<Employee> empList = new ArrayList<>); for Element empElement : empListElements) { Employee emp = new Employee); emp.setIdInteger.parseIntempElement.getAttributeValue"id"))); emp.setAgeInteger.parseIntempElement.getChildText"age"))); emp.setNameempElement.getChildText"name")); emp.setRoleempElement.getChildText"role")); emp.setGenderempElement.getChildText"gender")); empList.addemp); } //lets print Employees list information for Employee emp : empList) System.out.printlnemp); } catch Exception e) { e.printStackTrace); } } //Get JDOM document from DOM Parser private static org.jdom2.Document useDOMParserString fileName) throws ParserConfigurationException, SAXException, IOException { //creating DOM Document DocumentBuilderFactory dbFactory = DocumentBuilderFactory.newInstance); DocumentBuilder dBuilder; dBuilder = dbFactory.newDocumentBuilder); Document doc = dBuilder.parsenew FilefileName)); DOMBuilder domBuilder = new DOMBuilder); return domBuilder.builddoc); } }
如你所见,这里我使用DOM解析包装类获取JDOM Document对象。
运行程序输出:
Employee:: ID=1 Name=Pankaj Age=29 Gender=Male Role=Java DeveloperEmployee:: ID=2 Name=Lisa Age=35 Gender=Female Role=CEOEmployee:: ID=3 Name=Tom Age=40 Gender=Male Role=Manager
我们同样可以使用SAX和STAX解析机制来完成,我们可以使用下面方法完成:
/Get JDOM document from SAX Parserprivate static org.jdom2.Document useSAXParserString fileName) throws JDOMException, IOException { SAXBuilder saxBuilder = new SAXBuilder); return saxBuilder.buildnew FilefileName)); } //Get JDOM Document from STAX Stream Parser or STAX Event Parserprivate static org.jdom2.Document useSTAXParserString fileName, String type) throws FileNotFoundException, XMLStreamException, JDOMException{ iftype.equalsIgnoreCase"stream")){ StAXStreamBuilder staxBuilder = new StAXStreamBuilder); XMLInputFactory xmlInputFactory = XMLInputFactory.newInstance); XMLStreamReader xmlStreamReader = xmlInputFactory.createXMLStreamReadernew FileInputStreamfileName)); return staxBuilder.buildxmlStreamReader); } StAXEventBuilder staxBuilder = new StAXEventBuilder); XMLInputFactory xmlInputFactory = XMLInputFactory.newInstance); XMLEventReader xmlEventReader = xmlInputFactory.createXMLEventReadernew FileInputStreamfileName)); return staxBuilder.buildxmlEventReader); }
运行程序将会得到相同的输出,因为我们只是使用不同的包装类,但是获取的JDOM Document对象相同。
使用JDOM的好处是我们可以很方便的切换底层的解析机制而处理代码不发生改变。