- 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 DOM 解析器 - 解析 XML 文件
Java DOM 解析器是一個 Java API,用於解析任何 XML 文件。 使用提供的方法,我們可以使用 Java DOM 解析器檢索根元素、子元素及其屬性。
在本教程中,我們使用了getTagName()方法來檢索元素的標籤名稱,使用getFirstChild()來檢索元素的第一個子元素,並使用getTextContent()來獲取元素的文字內容。
使用 Java DOM 解析器解析 XML
在討論了 Java 中可用的各種 XML 解析器之後,現在讓我們看看如何使用 DOM 解析器來解析 XML 檔案。 我們使用parse()方法來解析 XML 檔案。 在直接進入示例之前,讓我們看看使用 Java DOM 解析器解析 XML 文件的步驟:
- 步驟 1:建立 DocumentBuilder 物件
- 步驟 2:讀取 XML
- 步驟 3:解析 XML 文件
- 步驟 4:檢索元素
步驟 1:建立 DocumentBuilder 物件
DocumentBuilderFactory 是一個工廠 API,透過建立 DOM 樹來獲取用於解析 XML 文件的解析器。 它具有 'newDocumentBuilder()' 方法,該方法建立 'DocumentBuilder' 類的例項。 此 DocumentBuilder 類用於獲取流、檔案、URL 和 SAX InputSource 形式的輸入。
DocumentBuilderFactory factory =DocumentBuilderFactory.newInstance(); DocumentBuilder docBuilder = factory.newDocumentBuilder();
步驟 2:讀取 XML
輸入可以是檔案型別或流型別。 要輸入 XML 檔案,請建立一個檔案物件並將檔案路徑作為引數傳遞。
File xmlFile = new File("input.xml");
為了以流的形式獲取輸入,我們使用了 StringBuilder 類並附加了輸入字串,然後將其轉換為位元組。 將獲得的 ByteArrayInputStream 作為輸入提供給文件。
StringBuilder xmlBuilder = new StringBuilder();
xmlBuilder.append("<?xml version="1.0"?> <rootElement></rootElement>");
ByteArrayInputStream input = new ByteArrayInputStream( xmlBuilder.toString().getBytes("UTF-8"));
步驟 3:解析 XML 文件
在上述步驟中建立的 DocumentBuilder 用於解析輸入 XML 檔案。 它包含一個名為 parse() 的方法,該方法接受檔案或輸入流作為引數並返回 DOM Document 物件。 如果給定的檔案或輸入流為 NULL,則此方法將丟擲 IllegalArgumentException。
Document xmldoc = docBuilder.parse(input);
步驟 4:檢索元素
org.w3c.dom.包的 Node 和 Element 介面提供各種方法來從 XML 文件中檢索有關元素的所需資訊。 此資訊包括元素的名稱、文字內容、屬性及其值。 我們有很多 DOM 介面和方法可以獲取此資訊。
檢索根元素名稱
XML 文件包含許多元素。 在 Java 中,XML/HTML 文件由名為Element的介面表示。 此介面提供各種方法來檢索、新增和修改 XML/HTML 文件的內容。
我們可以使用 Element 介面的getTagName()方法檢索根元素的名稱。 它以字串的形式返回根元素的名稱。
由於 Element 是一個介面,因此要建立其物件,我們需要使用getDocumentElement()方法。 此方法檢索並以物件的形式返回根元素。
示例
在下面的示例中,我們使用 StringBuilder 類傳遞了一個只有一個根元素 'college' 的簡單 XML 文件。 然後,我們檢索它並列印到控制檯。
import javax.xml.parsers.DocumentBuilderFactory;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import java.io.ByteArrayInputStream;
import javax.xml.parsers.DocumentBuilder;
public class RetrieveRootElementName {
public static void main(String[] args) {
try {
//Creating a DocumentBuilder Object
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
DocumentBuilder docBuilder = factory.newDocumentBuilder();
//Reading the XML
StringBuilder xmlBuilder = new StringBuilder();
xmlBuilder.append("<college></college>");
//Parsing the XML Document
ByteArrayInputStream input = new ByteArrayInputStream(xmlBuilder.toString().getBytes("UTF-8"));
Document xmldoc = docBuilder.parse(input);
//Retrieving the Root Element Name
Element element = xmldoc.getDocumentElement();
System.out.println("Root element name is "+element.getTagName());
} catch (Exception e) {
e.printStackTrace();
}
}
}
輸出
元素名稱“college”顯示在輸出螢幕上,如下所示:
Root element name is college
解析 XML 中的單個子元素
我們可以解析根元素內只有一個元素的簡單 XML 文件。 到目前為止,我們已經看到了如何檢索根元素。 現在,讓我們看看如何獲取根元素內的子元素。
由於我們只有一個子元素,因此我們使用getFirstChild()方法來檢索它。 此方法與根元素一起使用以獲取其第一個子元素。 它以 Node 物件的形式返回子節點。
檢索子節點後,使用getNodeName()方法獲取節點的名稱。 它以字串的形式返回節點名稱。
要獲取文字內容,我們使用getTextContent()方法。 它以字串的形式返回文字內容。
示例
讓我們看看下面的示例,其中我們有一個根元素和一個子元素。 這裡,“college”是根元素,其中“department”作為子元素。“department”元素具有文字內容“Computer Science”。 我們正在檢索子元素的名稱和文字內容。
import javax.xml.parsers.DocumentBuilderFactory;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.Node;
import java.io.ByteArrayInputStream;
import javax.xml.parsers.DocumentBuilder;
public class SingleSubElement {
public static void main(String[] args) {
try {
//Creating a DocumentBuilder Object
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
DocumentBuilder docBuilder = factory.newDocumentBuilder();
//Reading the XML
StringBuilder xmlBuilder = new StringBuilder();
xmlBuilder.append("<college><department>Computer Science</department></college>");
//Parsing the XML Document
ByteArrayInputStream input = new ByteArrayInputStream(xmlBuilder.toString().getBytes("UTF-8"));
Document xmldoc = docBuilder.parse(input);
//Retrieving the Root Element
Element element = xmldoc.getDocumentElement();
//Retrieving the Child Node
Node childNode = element.getFirstChild();
String childNodeName = childNode.getNodeName();
System.out.println("Sub Element name : " + childNodeName);
//Retrieving Text Content of the Child Node "+ childNodeName);
System.out.println("Text content of Sub Element : "+childNode.getTextContent());
} catch (Exception e) {
e.printStackTrace();
}
}
}
輸出視窗顯示子元素名稱和文字內容。
Sub Element name : department Text content of Sub Element : Computer Science
解析 XML 中的多個元素
要解析具有多個元素的 XML 文件,我們需要使用迴圈。getChildNodes()方法檢索元素的所有子節點並將其作為 NodeList 返回。 我們需要遍歷獲得的 NodeList 的所有元素,並像在前面幾節中那樣檢索每個元素的所需資訊。
示例
現在,讓我們向 XML 檔案 (**multipleElements.xml**) 新增另外兩個部門。 讓我們嘗試檢索所有部門名稱和員工人數。
<college>
<department>
<name>Computer Science</name>
<staffCount>20</staffCount>
</department>
<department>
<name>Electrical and Electronics</name>
<staffCount>23</staffCount>
</department>
<department>
<name>Mechanical</name>
<staffCount>15</staffCount>
</department>
</college>
在下面的程式中,我們將部門元素列表檢索到 NodeList 中,並迭代所有部門以獲取部門名稱和員工人數。
import java.io.File;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.DocumentBuilder;
import org.w3c.dom.Document;
import org.w3c.dom.NodeList;
import org.w3c.dom.Node;
import org.w3c.dom.Element;
public class MultipleElementsXmlParsing {
public static void main(String[] args) {
try {
//Input the XML file
File inputXmlFile = new File("src/multipleElements.xml");
//creating DocumentBuilder
DocumentBuilderFactory dbFactory = DocumentBuilderFactory.newInstance();
DocumentBuilder docBuilder = dbFactory.newDocumentBuilder();
Document xmldoc = docBuilder.parse(inputXmlFile);
//Retrieving the Root Element
Element element = xmldoc.getDocumentElement();
System.out.println("Root element name is "+element.getTagName());
//Getting the child elements List
NodeList nList = element.getChildNodes();
//Iterating through all the child elements of the root
for (int temp = 0; temp < nList.getLength(); temp++) {
Node nNode = nList.item(temp);
System.out.println("\nCurrent Element :" + nNode.getNodeName());
if (nNode.getNodeType() == Node.ELEMENT_NODE) {
Element eElement = (Element) nNode;
System.out.println("Name of the department : " + eElement.getElementsByTagName("name").item(0).getTextContent());
System.out.println("Staff Count of the department : " + eElement.getElementsByTagName("staffCount").item(0).getTextContent());
}
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
顯示所有三個部門及其名稱和員工人數。
Root element :college Current Element :department Name of the department : Computer Science Staff Count of the department : 20 Current Element :department Name of the department : Electrical and Electronics Staff Count of the department : 23 Current Element :department Name of the department : Mechanical Staff Count of the department : 15
解析 XML 中的屬性
XML 元素可以具有屬性,這些屬性可以使用getAttribute()方法檢索。 此方法將屬性名稱作為引數,並將相應的屬性值作為字串返回。如果指定的屬性名稱沒有屬性值或預設值,則返回空字串。
示例
現在,讓我們向“**attributesParsing.xml**”檔案中的所有部門元素新增一個屬性“deptcode”。
<?xml version = "1.0"?>
<college>
<department deptcode = "DEP_CS23">
<name>Computer Science</name>
<staffCount>20</staffCount>
</department>
<department deptcode = "DEP_EC34">
<name>Electrical and Electronics</name>
<staffCount>23</staffCount>
</department>
<department deptcode = "DEP_MC89">
<name>Mechanical</name>
<staffCount>15</staffCount>
</department>
</college>
在下面的程式中,我們正在檢索每個部門的 deptcode、名稱和員工人數。
import java.io.File;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.DocumentBuilder;
import org.w3c.dom.Document;
import org.w3c.dom.NodeList;
import org.w3c.dom.Node;
import org.w3c.dom.Element;
public class AttributesXmlParsing {
public static void main(String[] args) {
try {
//Input the XML file
File inputXmlFile = new File("attributesParsing.xml");
//creating DocumentBuilder
DocumentBuilderFactory dbFactory = DocumentBuilderFactory.newInstance();
DocumentBuilder docBuilder = dbFactory.newDocumentBuilder();
Document xmldoc = docBuilder.parse(inputXmlFile);
//Getting the root element
System.out.println("Root element :" + xmldoc.getDocumentElement().getNodeName());
NodeList nList = xmldoc.getElementsByTagName("department");
//Iterating through all the child elements of the root
for (int temp = 0; temp < nList.getLength(); temp++) {
Node nNode = nList.item(temp);
System.out.println("\nCurrent Element :" + nNode.getNodeName());
if (nNode.getNodeType() == Node.ELEMENT_NODE) {
Element eElement = (Element) nNode;
System.out.println("Department Code : " + eElement.getAttribute("deptcode"));
System.out.println("Name of the department : " + eElement.getElementsByTagName("name").item(0).getTextContent());
System.out.println("Staff Count of the department : " + eElement.getElementsByTagName("staffCount").item(0).getTextContent());
}
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
顯示三個部門及其相應的部門程式碼、名稱和員工人數。
Root element :college Current Element :department Department Code : DEP_CS23 Name of the department : Computer Science Staff Count of the department : 20 Current Element :department Department Code : DEP_EC34 Name of the department : Electrical and Electronics Staff Count of the department : 23 Current Element :department Department Code : DEP_MC89 Name of the department : Mechanical Staff Count of the department : 15