JDOM的详细介绍
提示:本文修订于2023年7月13日
1、JDOM诞生原因
因为DOM与平台和语言无关,是官方W3C 标准,并不能更好的发挥Java语言的自身特点,所以诞生了JDOM,它的目的是成为 Java 特定文档模型。
2、JDOM发展历程
由于是第一个 Java 特定模型,JDOM 一直得到大力推广和促进。后来,从JDOM分支延伸出来DOM4J,当然,这是后话,后面还会再详细介绍。
3、JDOM与DOM的区别
JDOM 与 DOM 主要有两方面不同:
(1)JDOM 仅使用具体类而不使用接口。这在某些方面简化了 API,但是也限制了其灵活性。
(2)API 大量使用了 Collections 类,简化了那些已经熟悉这些类的 Java 开发者的使用。
4、JDOM解析器介绍
JDOM 自身不包含解析器,通常使用 SAX解析器来解析和验证输入的 XML 文档。如下所示:
SAXBuilder sb = new SAXBuilder();
Document doc = sb.build(new FileInputStream("src/main/resources/dom.xml"));
SAXBuilder是一个JDOM解析器,能够将路径中xml文件解析到Document对象
另外,还可以将以前构造的 DOM 表示作为输入。如下所示:
DOMBuilder dBuilder = new DOMBuilder();
File xmlFile = new File("src/main/resources/dom.xml");
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
DocumentBuilder domBuilder = factory.newDocumentBuilder();
Document doc = dBuilder.build(domBuilder.parse(xmlFile));
5、JDOM常用的类
import org.jdom2.Document;
import org.jdom2.Element;
import org.jdom2.Attribute;
5.1、org.jdom2.Document的说明
与前文《Java DOM 操作经验总结》介绍的Java DOM(w3c标准)中的Document不同,在JDOM中Document是具体的类,而非接口,它最常用的方法是:getRootElement()
5.2、org.jdom2.Element和的org.jdom2.Attribute说明
与前文《Java DOM 操作经验总结》介绍的Java DOM(w3c标准)中的Element和Attribute不同,在JDOM中,可以利用Element和Attribute类的getName()
方法和getValue()
方法,使用很便捷,下文的例子有使用介绍。
5.3、org.jdom2.Element的getValue方法和getText方法的区别
getText方法只能获得本元素所包含的text文本值,而getValue方法不仅能获得本元素所包含的text值,还可以把其子代元素的值也获得。如下所示:
<users>
<user id="1">
<firstname>Peter</firstname>
<lastname>Brown</lastname>
<occupation>programmer</occupation>
</user>
</users>
users.getText()方法返回值为空,而users.getValue()方法返回值为:Peter Brown programmer
6、JDOM操作实战
xml文件如下所示:
<?xml version="1.0" encoding="UTF-8"?>
<users>
<user id="1">
<firstname>Peter</firstname>
<lastname>Brown</lastname>
<occupation>programmer</occupation>
</user>
<user id="2">
<firstname>Martin</firstname>
<lastname>Smith</lastname>
<occupation>accountant</occupation>
</user>
<user id="3">
<firstname>Lucy</firstname>
<lastname>Gordon</lastname>
<occupation>teacher</occupation>
</user>
</users>
6.1、JDOM操作实战1:利用SAXBuilder解析xml文件
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.util.List;
import org.jdom2.Attribute;
import org.jdom2.Document;
import org.jdom2.Element;
import org.jdom2.JDOMException;
import org.jdom2.input.SAXBuilder;
public class Jdom {
public static void main(String[] args)
throws FileNotFoundException, JDOMException, IOException {
SAXBuilder sb = new SAXBuilder();
Document doc = sb.build(new FileInputStream("src/main/resources/dom2.xml"));
Element root = doc.getRootElement();
List<Element> userList = root.getChildren();
for (int i = 0; i < userList.size(); i++) {
Element user = userList.get(i);
List<Attribute> attList = user.getAttributes();
for (Attribute attr : attList) {
System.out.println(attr.getName() + "\t" + attr.getValue());
}
}
System.out.println("\n----------------------------\n");
for (int i = 0; i < userList.size(); i++) {
Element user = userList.get(i);
List<Element> eleList = user.getChildren();
for (Element ele : eleList) {
System.out.println(ele.getName() + "\t" + ele.getValue());
}
System.out.println("================================================");
}
}
}
6.2、JDOM操作实战2:利用DOMBuilder解析xml文件
import java.io.File;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.util.List;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;
import org.jdom2.Attribute;
import org.jdom2.Document;
import org.jdom2.Element;
import org.jdom2.JDOMException;
import org.jdom2.input.DOMBuilder;
import org.xml.sax.SAXException;
public class Jdom2 {
public static void main(String[] args)
throws FileNotFoundException, JDOMException, IOException, ParserConfigurationException, SAXException {
DOMBuilder dBuilder = new DOMBuilder();
File xmlFile = new File("src/main/resources/dom2.xml");
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
DocumentBuilder domBuilder = factory.newDocumentBuilder();
Document doc = dBuilder.build(domBuilder.parse(xmlFile));
Element root = doc.getRootElement();
List<Element> userList = root.getChildren();
for (int i = 0; i < userList.size(); i++) {
Element user = userList.get(i);
List<Attribute> attList = user.getAttributes();
for (Attribute attr : attList) {
System.out.println(attr.getName() + "\t" + attr.getValue());
}
}
System.out.println("\n----------------------------\n");
for (int i = 0; i < userList.size(); i++) {
Element user = userList.get(i);
List<Element> eleList = user.getChildren();
for (Element ele : eleList) {
System.out.println(ele.getName() + "\t" + ele.getValue());
}
System.out.println("================================================");
}
}
}