
- 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 XPath 解析器 - 解析 XML 文件
Java XPath 解析器是 Java 中的一個 API,用於使用 XPath 表示式和函式解析 XML 文件。它幫助我們遍歷整個 XML 文件,並將元素作為節點獲取到 NodeList 中。'javax.xml.xpath' 包提供了用於評估 XPath 表示式的 API。在本章中,我們將學習如何遍歷 XML 文件中的所有節點。
使用 Java XPath 解析器解析 XML
以下是使用 Java XPath 解析器解析文件的步驟:
- 步驟 1:建立 DocumentBuilder
- 步驟 2:讀取 XML
- 步驟 3:從檔案或流建立文件
- 步驟 4:構建 XPath
- 步驟 5:準備和評估 XPath 表示式
- 步驟 6:迭代 NodeList
- 步驟 7:檢索元素
步驟 1:建立 DocumentBuilder
DocumentBuilderFactory 是一個工廠 API,用於建立 DocumentBuilder 物件。DocumentBuilderFactory 的 newDocumentBuilder() 方法返回一個 DocumentBuilder 物件,如下所示:
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); DocumentBuilder builder = factory.newDocumentBuilder();
步驟 2:讀取 XML
FileReader 類用於從輸入檔案讀取字元流。如果找不到檔案或由於某些原因無法讀取檔案,則以下語句將丟擲“FileNotFoundException”。
FileReader fileReader = new FileReader("src/input.txt");
除了從檔案讀取 XML 內容外,我們還可以將內容作為字串獲取,並將其轉換為位元組,如下所示:
StringBuilder xmlBuilder = new StringBuilder(); xmlBuilder.append("<class>xyz</class>"); ByteArrayInputStream input = new ByteArrayInputStream(xmlBuilder.toString().getBytes("UTF-8"));
步驟 3:從檔案或流建立文件
第一步中建立的 DocumentBuilder 物件用於從輸入檔案或輸入流建立文件。parse() 方法以檔案或流作為引數,並返回一個 Document 物件,如下所示:
Document doc = builder.parse(input);
步驟 4:構建 XPath
要使用 XPath 解析 XML 文件,我們需要使用 XPathFactory 的 newXPath() 方法構建一個新的 XPath。此方法返回一個新的 XPath,如下所示:
XPath xPath = XPathFactory.newInstance().newXPath();
步驟 5:準備和評估 XPath 表示式
正如我們在上一章中討論的那樣,XPath 具有幫助我們從 XML 文件檢索資訊的表示式,在這裡我們需要根據需求建立一個這樣的表示式並對其進行評估。evaluate() 方法將表示式的結果作為 NodeList 返回,如下所示:
String expression = "/class/student"; NodeList nodeList = (NodeList) xPath.compile(expression).evaluate( doc, XPathConstants.NODESET);
步驟 6:迭代 NodeList
現在迭代我們在步驟 5 中獲得的 NodeList 以檢查每個節點並相應地檢索資訊。這裡,我們使用 for 迴圈迭代 NodeList,您可以使用任何您選擇的迴圈。
for (int i = 0; i < nodeList.getLength(); i++) { Node nNode = nodeList.item(i); ... }
步驟 7:檢索元素
完成上述六個步驟後,我們將獲得節點形式的元素。透過使用 DOM 中提供的介面方法,我們可以檢索必要的元素和屬性。
檢索根元素
要從 XML 文件檢索根元素,我們有 XPath 表示式“/”。使用此表示式並對其進行評估,我們將獲得只有一個節點的 NodeList。
Node 介面的 getNodeName() 方法將節點的名稱作為 String 物件檢索,而 getTextContent() 方法將節點的文字內容作為 String 返回。
示例
在下面的示例中,我們將 XML 內容作為 StringBuilder 物件,並使用 parse() 函式對其進行解析。我們只有一個元素,顯然是根元素,並且文字內容為“xyz class”。使用上面討論的方法,我們檢索根元素的資訊。
import java.io.ByteArrayInputStream; import javax.xml.parsers.DocumentBuilderFactory; import javax.xml.parsers.DocumentBuilder; import javax.xml.xpath.XPath; import javax.xml.xpath.XPathConstants; import javax.xml.xpath.XPathFactory; import org.w3c.dom.Document; import org.w3c.dom.NodeList; import org.w3c.dom.Node; public class RetrieveRoot { public static void main(String[] args) { try { //Creating a DocumentBuilder DocumentBuilderFactory dbFactory = DocumentBuilderFactory.newInstance(); DocumentBuilder dBuilder = dbFactory.newDocumentBuilder(); //Reading the XML StringBuilder xmlBuilder = new StringBuilder(); xmlBuilder.append("<class>xyz class</class>"); ByteArrayInputStream input = new ByteArrayInputStream(xmlBuilder.toString().getBytes("UTF-8")); //Creating Document from file or Stream Document doc = dBuilder.parse(input); //Building XPath XPath xPath = XPathFactory.newInstance().newXPath(); //Preparing and Evaluating XPath expression String expression = "/"; NodeList nodeList = (NodeList) xPath.compile(expression).evaluate( doc, XPathConstants.NODE); //Iterating over NodeList for (int i = 0; i < nodeList.getLength(); i++) { Node node = nodeList.item(i); //Retrieving Root Element System.out.println("Root Element Name: " + node.getNodeName()); System.out.println("Text Content: " + node.getTextContent()); } } catch(Exception e) { e.printStackTrace(); } } }
輸出
根元素名稱和文字內容將顯示在控制檯上。
Root Element Name: class Text Content: xyz class
檢索屬性
在評估 XPath 表示式後獲得的 NodeList 具有不同節點型別的節點。如果節點型別等於“ELEMENT_NODE”,我們可以將這些節點轉換為元素。Element 介面的 getAttribute("attribute_name") 方法用於以字串形式檢索屬性的值。
示例
以下 studentData.xml 檔案包含三個學生的資訊。我們將使用 Java 中的 XPath 解析器庫檢索這些資訊。class 元素是具有三個 student 子元素的根元素。讓我們看看如何在 Java 中使用 XPath 庫來檢索三個學生的資訊。
<?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>singh</lastname> <nickname>jazz</nickname> <marks>90</marks> </student> </class>
在下面的 RetrieveAttributes.java 程式中,我們解析了 student.xml 檔案並構建了一個文件。表示式 '/class/student' 用於將 'class' 節點內的所有 'student' 節點獲取到 NodeList 中。然後迭代 NodeList 並獲取每個學生的資訊。
import java.io.File; import javax.xml.parsers.DocumentBuilderFactory; import javax.xml.parsers.DocumentBuilder; import javax.xml.xpath.XPath; import javax.xml.xpath.XPathConstants; import javax.xml.xpath.XPathFactory; import org.w3c.dom.Document; import org.w3c.dom.NodeList; import org.w3c.dom.Node; import org.w3c.dom.Element; public class RetrieveAttributes { public static void main(String[] args) { try { //Creating a DocumentBuilder DocumentBuilderFactory dbFactory = DocumentBuilderFactory.newInstance(); DocumentBuilder dBuilder = dbFactory.newDocumentBuilder(); //Reading the XML File inputFile = new File("studentData.xml"); //Creating Document from file or Stream Document doc = dBuilder.parse(inputFile); //Building XPath XPath xPath = XPathFactory.newInstance().newXPath(); //Preparing and Evaluating XPath expression String expression = "/class/student"; NodeList nodeList = (NodeList) xPath.compile(expression).evaluate( doc, XPathConstants.NODESET); //Iterating over NodeList for (int i = 0; i < nodeList.getLength(); i++) { Node nNode = nodeList.item(i); System.out.println("\nCurrent Element :" + nNode.getNodeName()); //Retrieving Elements if (nNode.getNodeType() == Node.ELEMENT_NODE) { Element eElement = (Element) nNode; System.out.println("Student roll no :" + eElement.getAttribute("rollno")); System.out.println("First Name : " + eElement .getElementsByTagName("firstname") .item(0) .getTextContent()); System.out.println("Last Name : " + eElement .getElementsByTagName("lastname") .item(0) .getTextContent()); System.out.println("Nick Name : " + eElement .getElementsByTagName("nickname") .item(0) .getTextContent()); System.out.println("Marks : " + eElement .getElementsByTagName("marks") .item(0) .getTextContent()); } } } catch (Exception e) { e.printStackTrace(); } } }
輸出
三個學生的所有資訊都將顯示在控制檯上。
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 : singh Nick Name : jazz Marks : 90