- 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