1.Document
導入dom4j的步驟
- 去官網下載 zip 包。http://www.dom4j.org/
- 在項目中創建一個文件夾:lib
- 將dom4j-2.1.1.jar文件複製到 lib 文件夾
- 在jar文件上點右鍵,選擇 Add as Library -> 點擊OK
- 在類中導包使用
得到Document對象
步驟:
文件Contact.xml放在src目錄下
- 創建一個SAXReader對象,用於讀取 xml 文件
- 從類路徑下加載xml文件,得到輸入流對象
- 通過 SAXReader對象的read(InputStream in )方法,從輸入流中讀取,生成文檔對象
代碼
/**
1. 得到文檔對象
2. 得到根元素
*/
public static void main(String[] args) throws FileNotFoundException, DocumentException {
//1. 創建類: 讀取XML文件
SAXReader reader = new SAXReader();
//不建議這麼寫
//FileInputStream in = new FileInputStream("D:\\IdeaWork\\JavaEE105\\day23-xml\\src\\Contacts.xml");
//src目錄就是編譯以後的類路徑,從類路徑下得到輸入。
InputStream in = Demo3Document.class.getResourceAsStream("/Contacts.xml");
//2.通過reader來讀取xml, 生成了一個document對象
Document document = reader.read(in);
//3. 輸出文檔
System.out.println(document);
//4. 得到文檔以後,通過文檔得到根元素
Element rootElement = document.getRootElement();
System.out.println(rootElement);
}
Document常用方法
方法名 | 功能說明 |
---|---|
Element getRootElement() | 通過文檔對象得到根元素 |
String getName() | 獲取元素名 |
List<Element> elements() | 獲取所有子元素 |
List<Element> elements(String name) | 獲取知名名字的多個子元素 |
2.Attribute
Attribute常用方法:
方法名 | 功能說明 |
---|---|
String getName() | 得到屬性的名字 |
String getValue() | 得到屬性的值 |
得到屬性值的兩種方式
- 先得到Attribute對象,再通過Attribute對象得到屬性的值
- 通過方法attributeValue()直接得到屬性值
案例:
- 使用2種方式,得到contact上id屬性值
- 在contact元素上添加一個vip的屬性值爲true/false,得到contact上所有的屬性名和屬性值
效果
代碼:
public static void main(String[] args) throws DocumentException {
//1. 創建SAXReader
SAXReader reader = new SAXReader();
//2. 調用read 方法,讀取 xml 文件
Document document = reader.read(Demo4Attribute.class.getResourceAsStream("/Contacts.xml"));
//3. 得到根元素
Element rootElement = document.getRootElement();
//4. 獲得第1個contact元素對象
Element contact = rootElement.element("contact");
//5. 通過方式1:得到contact上id屬性值
Attribute idAttr = contact.attribute("id");
String idValue = idAttr.getValue();
System.out.println(idValue);
//6. 通過方式2:得到contact上id屬性值
String id = contact.attributeValue("id");
System.out.println(id);
//7. 得到contact上所有的屬性名和屬性值
List<Attribute> attributes = contact.attributes();
for (Attribute attribute : attributes) {
System.out.println("屬性名:" + attribute.getName());
System.out.println("屬性值:" + attribute.getValue());
}
}
獲取文本內容
通過元素對象得到文本字符串得到文本元素的前提:先得到元素對象
- 注意:
空格、換行、製表符:也是屬於文本的一部分,所以在解析xml文件的時候,格式化XML文件要注意。
元素中得到文本有關的方法
Element**元素中的方法 | 說明 |
---|---|
String getText() | 得到元素中文本 |
String elementTextTrim(元素名) | 得到子元素中文本,去掉先後空格 |
String elementText(元素名) | 得到子元素中文本 |
需求
得到第1個contact中的name元素,輸出name元素的文本。分別通過下面三個方法得到:
- 通過getText()方法得到
- 直接得到元素的內容
- 得到去掉空格的文本
代碼;
public static void main(String[] args) throws DocumentException {
// 1.創建SAXReader
SAXReader reader = new SAXReader();
// 2.調用read 方法,讀取 xml 文件
Document document = reader.read(Demo5Text.class.getResourceAsStream("/Contacts.xml"));
// 3.得到根元素
Element rootElement = document.getRootElement();
// 得到contact標籤
Element contact = rootElement.element("contact");
// 得到name標籤中的文本
Element name = contact.element("name");
System.out.println(name.getText());
// 得到子元素的文本
System.out.println(contact.elementText("name"));
// 得到子元素的文本並且去掉前後空格
System.out.println(contact.elementTextTrim("name"));
}
XML解析案例
目標
利用 Dom4j 的知識,將Contact.xml 文件中的聯繫人數據封裝成List集合,其中每個元素是實體類Contact。打印輸出 List 中的每個元素。
運行效果
數據準備
Contact.xml
<?xml version="1.0" encoding="UTF-8"?>
<contactList>
<contact id="1">
<name>潘金蓮</name>
<gender>女</gender>
<email>panpan@itcast.cn</email>
</contact>
<contact id="2">
<name>武松</name>
<gender>男</gender>
<email>wusong@itcast.cn</email>
</contact>
<contact id="3">
<name>武大狼</name>
<gender>男</gender>
<email>wuda@itcast.cn</email>
</contact>
</contactList>
Contact.java實體類
// 聯繫人實體類
public class Contact {
private int id;
private String name;
private String gender;
private String email;
// 省略構造方法get、set、tostring
}
代碼:
public static void main(String[] args) throws DocumentException {
//1. 得到SaxReader
SAXReader reader = new SAXReader();
//2. 得到文檔對象
Document document = reader.read(Demo6Contact.class.getResourceAsStream("/Contact.xml"));
//3. 得到根元素
Element rootElement = document.getRootElement();
//4. 創建集合
List<Contact> list = new ArrayList<>();
//5. 得到所有聯繫人
List<Element> contactElements = rootElement.elements();
//每個就是一個聯繫人
for (Element contactElement : contactElements) {
//創建一個聯繫人
Contact contact = new Contact();
//System.out.println(contactElement.getName()); //打印標籤名
//得到id屬性值,將字符串轉成int類型
int id = Integer.parseInt(contactElement.attributeValue("id"));
contact.setId(id);
//得到子元素中文本
contact.setName(contactElement.elementText("name"));
contact.setGender(contactElement.elementText("gender"));
contact.setEmail(contactElement.elementText("email"));
//將當前對象添加到集合中
list.add(contact);
}
//打印集合中所有的聯繫人
for (Contact contact : list) {
System.out.println(contact);
}
}