- 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