
- 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