- Java XML 教程
- Java XML 首頁
- Java XML 概述
- Java XML 解析器
- Java DOM 解析器
- Java DOM 解析器
- 解析 XML 文件
- 查詢 XML 文件
- 建立 XML 文件
- 修改 XML 文件
- Java SAX 解析器
- Java SAX 解析器
- 解析 XML 文件
- 查詢 XML 文件
- 建立 XML 文件
- 修改 XML 文件
- JDOM XML 解析器
- JDOM XML 解析器
- 解析 XML 文件
- 查詢 XML 文件
- 建立 XML 文件
- 修改 XML 文件
- Java StAX 解析器
- Java StAX 解析器
- 解析 XML 文件
- 查詢 XML 文件
- 建立 XML 文件
- 修改 XML 文件
- Java XPath 解析器
- Java XPath 解析器
- 解析 XML 文件
- 查詢 XML 文件
- 建立 XML 文件
- 修改 XML 文件
- Java DOM4J 解析器
- Java DOM4J 解析器
- 解析 XML 文件
- 查詢 XML 文件
- 建立 XML 文件
- 修改 XML 文件
- Java XML 有用資源
- Java XML - 常見問題解答
- Java XML - 快速指南
- Java XML - 有用資源
- Java XML - 討論
Java JDOM 解析器 - 解析 XML 文件
Java JDOM 解析器是一個 Java 開源 API,它包含用於解析 XML 文件的類和方法。JDOM 透過使用 DOMBuilder 或 SAXBuilder 在記憶體中建立一個樹形文件結構,從而提供對 XML 元素的隨機訪問。本章我們將學習如何使用 SAX 解析器從 XML 檔案構建 JDOM 文件。
使用 JDOM 解析器解析 XML
使用 JDOM 解析器解析文件的步驟如下:
- 步驟 1:建立 SAXBuilder 物件
- 步驟 2:讀取 XML
- 步驟 3:解析 XML 文件
- 步驟 4:檢索元素
步驟 1:建立 SAXBuilder 物件
使用 SAX 解析器構建 JDOM 文件如下:
SAXBuilder saxBuilder = new SAXBuilder();
我們也可以使用現有的 DOM org.w3c.dom.Document 來建立 JDOM 文件,如下所示:
DOMBuilder domBuilder = new DOMBuilder();
步驟 2:讀取 XML
將 XML 檔案讀入 File 物件,如下所示:
File xmlFile = new File("input.xml");
我們也可以使用 StringBuilder 物件獲取 XML 內容。稍後,我們可以將其轉換為位元組進行解析。
StringBuilder xmlBuilder = new StringBuilder();
xmlBuilder.append("<?xml version="1.0"?> <rootElement></rootElement>");
ByteArrayInputStream input = new ByteArrayInputStream( xmlBuilder.toString().getBytes("UTF-8"));
步驟 3:解析 XML 文件
使用 build() 函式解析 XML 檔案或輸入流。它根據給定的檔案或輸入流構建 JDOM 文件。如果解析文件時出錯,則會丟擲 JDOMException 和 IOException。
Document document = saxBuilder.build(input);
步驟 4:檢索元素
完成前三個步驟後,我們已經成功地從 XML 檔案或流中構建了 JDOM 文件。現在,我們可以使用 Document 和 Element 類中提供的 method 獲取文件中的所有相關資訊。
檢索根元素
Document 介面的 getRootElement() 方法以 Element 物件的形式返回文件的根元素。
Element 物件的 getName() 方法以字串的形式返回元素的名稱。
示例
以下 RetrieveRootElement.java 程式將 XML 內容放入 StringBuilder 物件中。然後將其轉換為位元組,並使用 build() 函式進行解析。它檢索根元素並列印根元素的名稱。
import java.io.ByteArrayInputStream;
import org.jdom2.Document;
import org.jdom2.Element;
import org.jdom2.input.SAXBuilder;
public class RetrieveRootElement {
public static void main(String args[]) {
try {
//Creating a SAXBuilder Object
SAXBuilder saxBuilder = new SAXBuilder();
//Reading the XML
StringBuilder xmlBuilder = new StringBuilder();
xmlBuilder.append("<class></class>");
ByteArrayInputStream input = new ByteArrayInputStream(xmlBuilder.toString().getBytes("UTF-8"));
//Parsing the XML Document
Document document = saxBuilder.build(input);
//Retrieving the Root Element Name
Element root_element = document.getRootElement();
System.out.println("Root Element Name : " + root_element.getName());
} catch (Exception e) {
e.printStackTrace();
}
}
}
輸出
根元素名稱“class”將列印在輸出螢幕上。
Root Element Name : class
檢索子元素
要檢索元素的子元素,請在 Element 物件上使用 getChildren() 方法。它以列表的形式返回子元素。此列表包含所有子元素,以 Element 物件的形式存在。
要檢索元素的文字內容,請在 Element 物件上使用 getText() 方法。它返回 Element 的開始和結束標記之間的內容。
示例
讓我們向 class 元素新增三個 student 子元素,並將此檔案儲存為 student.xml。學生的姓名在每個 student 元素的文字內容中提到。
<?xml version = "1.0"?> <class> <student>dinkar</student> <student>Vaneet</student> <student>jasvir</student> </class>
現在,以下 java 程式讀取 student.xml 檔案並檢索所有子元素及其文字內容。
import java.io.File;
import java.util.List;
import org.jdom2.Document;
import org.jdom2.Element;
import org.jdom2.input.SAXBuilder;
public class RetrievingChildElements {
public static void main(String[] args) {
try {
//Creating a SAXBuilder Object
SAXBuilder saxBuilder = new SAXBuilder();
//Reading the XML
File inputFile = new File("student.xml");
//Parsing the XML Document
Document document = saxBuilder.build(inputFile);
//Retrieving Root Element
Element RootElement = document.getRootElement();
System.out.println("Root element :" + RootElement.getName());
//Retrieving Child Elements
List<Element> studentList = RootElement.getChildren();
System.out.println("----------------------------");
for (int temp = 0; temp < studentList.size(); temp++) {
Element student = studentList.get(temp);
System.out.println("\nCurrent Element :" + student.getName());
System.out.println("Text Content :" + student.getText());
}
} catch(Exception e) {
e.printStackTrace();
}
}
}
輸出
所有三個子元素及其文字內容都將顯示。
Root element :class ---------------------------- Current Element :student Text Content :dinkar Current Element :student Text Content :Vaneet Current Element :student Text Content :jasvir
檢索屬性
Element 物件上的 getAttribute("attr_name") 方法將屬性名稱作為引數,並以 Attribute 物件的形式檢索屬性。如果元素中沒有這樣的屬性,則返回 null。
Attribute 物件上的 getValue() 方法將屬性的值作為文字內容檢索。
示例
對於 student.xml 檔案,讓我們向 student 元素新增一些子元素以及屬性“rollno”。現在,讓我們嘗試使用 JDOM 解析器 API 檢索所有這些資訊。
<?xml version = "1.0"?>
<class>
<student rollno = "393">
<firstname>dinkar</firstname>
<lastname>kad</lastname>
<nickname>dinkar</nickname>
<marks>85</marks>
</student>
<student rollno = "493">
<firstname>Vaneet</firstname>
<lastname>Gupta</lastname>
<nickname>vinni</nickname>
<marks>95</marks>
</student>
<student rollno = "593">
<firstname>jasvir</firstname>
<lastname>singn</lastname>
<nickname>jazz</nickname>
<marks>90</marks>
</student>
</class>
在下面的 RetrievingAttributes.java 程式中,我們首先在一個 Element 列表中收集所有子元素,然後使用 getChild() 方法獲取 student 元素內每個子元素的詳細資訊。
import java.io.File;
import java.util.List;
import org.jdom2.Attribute;
import org.jdom2.Document;
import org.jdom2.Element;
import org.jdom2.input.SAXBuilder;
public class RetrievingAttributes {
public static void main(String[] args) {
try {
//Creating a SAXBuilder Object
SAXBuilder saxBuilder = new SAXBuilder();
//Reading the XML
File inputFile = new File("student.xml");
//Parsing the XML Document
Document document = saxBuilder.build(inputFile);
//Retrieving Root Element
Element RootElement = document.getRootElement();
System.out.println("Root element :" + RootElement.getName());
//Retrieving Child Elements and Attributes
List<Element> studentList = RootElement.getChildren();
System.out.println("----------------------------");
for (int temp = 0; temp < studentList.size(); temp++) {
Element student = studentList.get(temp);
System.out.println("\nCurrent Element :"
+ student.getName());
Attribute attribute = student.getAttribute("rollno");
System.out.println("Student roll no : "
+ attribute.getValue() );
System.out.println("First Name : "
+ student.getChild("firstname").getText());
System.out.println("Last Name : "
+ student.getChild("lastname").getText());
System.out.println("Nick Name : "
+ student.getChild("nickname").getText());
System.out.println("Marks : "
+ student.getChild("marks").getText());
}
} catch(Exception e) {
e.printStackTrace();
}
}
}
輸出
每個學生的資訊以及他們的學號都將顯示。
Root element :class ---------------------------- Current Element :student Student roll no : 393 First Name : dinkar Last Name : kad Nick Name : dinkar Marks : 85 Current Element :student Student roll no : 493 First Name : Vaneet Last Name : Gupta Nick Name : vinni Marks : 95 Current Element :student Student roll no : 593 First Name : jasvir Last Name : singn Nick Name : jazz Marks : 90