如何在 Java 中读取 XML 文件

2024 年 9 月 10 日 | 阅读 8 分钟

在 Java 中读取 XML 文件与其他文件(如 .docx 和 .txt)的读取方式有很大不同,因为 XML 文件在标签之间包含数据。Java 提供了多种解析 XML 文件的方法。Java 中有两个解析器可以解析 XML 文件:

  • Java DOM 解析器
  • Java SAX 解析器

Java DOM 解析器

DOM API 提供了读写 XML 文件的类。我们可以使用 DOM API 创建、删除、修改和重新排列节点。DOM 解析器会解析整个 XML 文件,并在内存中创建一个 DOM 对象。它以 树形结构 的形式表示 XML 文件,便于遍历和操作。在 DOM 中,XML 文件中的一切都是一个 节点。节点代表 XML 文件的某个组件。DOM 解析器在处理过程中 速度较慢,将 XML 文件加载到内存时会占用 大量内存

在 Java 中读取 XML 文件,我们必须遵循以下过程:

  • 实例化 XML 文件: DOM 解析器将 XML 文件加载到内存中,并将每个标签视为一个元素。
  • 获取根节点: Document 类提供了 getDocumentElement() 方法来获取 XML 文件的根节点和元素。
  • 获取所有节点: getElementByTagName() 方法可以从 XML 文件中检索所有特定标签名称的节点。其中 ELEMENT_NODE 类型指的是具有子元素的非文本节点。如果我们想从头开始访问所有节点(包括根节点),可以递归调用 getChildElement() 方法。
  • 按文本值获取节点: 我们可以使用 getElementByTextValue() 方法来按值搜索节点。
  • 按属性值获取节点: 如果我们想通过特定属性的值来搜索节点,可以使用 getElementByTagName() 方法和 getAttribute() 方法结合使用。

使用 Eclipse 在 Java 中读取 XML 文件的步骤

步骤 1: 创建一个简单的 Java 项目。

步骤 2: 创建一个类文件并为其命名。我们已将类文件命名为 ReadXMLFileExample1

步骤 3: 编写以下代码。

步骤 4: 下载 dom-2.3.0-jaxb-1.0.6.jar 文件: 点击此处...

步骤 5: 在项目中创建一个 lib 文件夹。

步骤 6:dom-2.3.0-jaxb-1.0.6.jar 文件复制并粘贴到 lib 文件夹中。

步骤 7: 设置 类路径

右键单击项目 -> Build Path -> Configure Build Path -> Add External JARs -> 选择 JAR 文件 -> 单击 Open 按钮 -> Apply and Close。

步骤 8: 创建一个 XML 文件。我们已创建一个名为 XMLFile.xml 的 XML 文件,并向其中写入以下数据。

步骤 9: 运行项目。

创建 XML 文件:XMLFile.xml

使用 DOM 解析器读取 XML 文件的示例

输出

Root element: class

Node Name: student
Student id: 101
First Name: Naman
Last Name: Kumar
Subject: Math
Marks: 83

Node Name: student
Student id: 102
First Name: Kapil
Last Name: Kumar
Subject: Chemistry
Marks: 60

Node Name: student
Student id: 103
First Name: Harsh
Last Name: Singh
Subject: English
Marks: 70

Node Name: student
Student id: 104
First Name: Jitesh
Last Name: Singh
Subject: Physics
Marks: 76

让我们看另一个读取 XML 文件的示例。

使用 DOM 解析器读取 XML 文件的示例

以下示例读取相同的 XML 文件 XMLFile.xml,并展示了如何逐个遍历节点。它会打印节点的值、名称以及任何存在的属性。

示例

输出

Root element: class

Node Name =class [OPEN]
Node Content =
	
		101
		Naman
		Kumar
		Maths
		83
	
		102
		Kapil
		Kumar
		Chemistry
		60
	
		103
		Harsh
		Singh
		English
		70
	
		104
		Jitesh
		Singh
		Physics
		76
	
Node Name =student [OPEN]
Node Content =
		101
		Naman
		Kumar
		Maths
		83
	
Node Name =id [OPEN]
Node Content =101
Node Name =id [CLOSE]

Node Name =firstname [OPEN]
Node Content =Naman
Node Name =firstname [CLOSE]

Node Name =lastname [OPEN]
Node Content =Kumar
Node Name =lastname [CLOSE]

Node Name =subject [OPEN]
Node Content =Math
Node Name =subject [CLOSE]

Node Name =marks [OPEN]
Node Content =83
Node Name =marks [CLOSE]
Node Name =student [CLOSE]

Node Name =student [OPEN]
Node Content =
		102
		Kapil
		Kumar
		Chemistry
		60
	
Node Name =id [OPEN]
Node Content =102
Node Name =id [CLOSE]

Node Name =firstname [OPEN]
Node Content =Kapil
Node Name =firstname [CLOSE]

Node Name =lastname [OPEN]
Node Content =Kumar
Node Name =lastname [CLOSE]

Node Name =subject [OPEN]
Node Content =Chemistry
Node Name =subject [CLOSE]

Node Name =marks [OPEN]
Node Content =60
Node Name =marks [CLOSE]
Node Name =student [CLOSE]

Node Name =student [OPEN]
Node Content =
		103
		Harsh
		Singh
		English
		70
	
Node Name =id [OPEN]
Node Content =103
Node Name =id [CLOSE]

Node Name =firstname [OPEN]
Node Content =Harsh
Node Name =firstname [CLOSE]

Node Name =lastname [OPEN]
Node Content =Singh
Node Name =lastname [CLOSE]

Node Name =subject [OPEN]
Node Content =English
Node Name =subject [CLOSE]

Node Name =marks [OPEN]
Node Content =70
Node Name =marks [CLOSE]
Node Name =student [CLOSE]

Node Name =student [OPEN]
Node Content =
		104
		Jitesh
		Singh
		Physics
		76
	
Node Name =id [OPEN]
Node Content =104
Node Name =id [CLOSE]

Node Name =firstname [OPEN]
Node Content =Jitesh
Node Name =firstname [CLOSE]

Node Name =lastname [OPEN]
Node Content =Singh
Node Name =lastname [CLOSE]

Node Name =subject [OPEN]
Node Content =Physics
Node Name =subject [CLOSE]

Node Name =marks [OPEN]
Node Content =76
Node Name =marks [CLOSE]
Node Name =student [CLOSE]
Node Name =class [CLOSE]

Java SAX 解析器

Java SAX 解析器是 Simple API for XML 的缩写。SAX 解析器会 逐行 解析 XML 文件。当它遇到 XML 文件中的开始标签、结束标签和字符数据时,会触发事件。SAX 解析器也称为 事件驱动解析器

SAX 解析器不会将任何 XML 文件加载到内存中。它也不会创建 XML 文档的任何对象表示。SAX 解析器使用回调函数通知客户端 XML 文档的结构。与 DOM 解析器相比,它 速度更快,占用的 内存更少

SAX 是 XML 的一个 流式接口,这意味着 XML 文件从文档顶部开始,并在根元素关闭时结束,按顺序进行解析。

使用 SAX 解析器读取 XML 文件的示例

输出

Start Element: class
Start Element: student
Start Element: id
ID: 101
End Element: id
Start Element: firstname
First Name: Naman
End Element: firstname
Start Element: lastname
Last Name: Kumar
End Element: lastname
Start Element: subject
Subject: Math
End Element: subject
Start Element: marks
Marks: 83
End Element: marks
End Element: student
Start Element: student
Start Element: id
ID: 102
End Element: id
Start Element: firstname
First Name: Kapil
End Element: firstname
Start Element: lastname
Last Name: Kumar
End Element: lastname
Start Element: subject
Subject: Chemistry
End Element: subject
Start Element: marks
Marks: 60
End Element: marks
End Element: student
Start Element: student
Start Element: id
ID: 103
End Element: id
Start Element: firstname
First Name: Harsh
End Element: firstname
Start Element: lastname
Last Name: Singh
End Element: lastname
Start Element: subject
Subject: English
End Element: subject
Start Element: marks
Marks: 70
End Element: marks
End Element: student
Start Element: student
Start Element: id
ID: 104
End Element: id
Start Element: firstname
First Name: Jitesh
End Element: firstname
Start Element: lastname
Last Name: Singh
End Element: lastname
Start Element: subject
Subject: Physics
End Element: subject
Start Element: marks
Marks: 76
End Element: marks
End Element: student
End Element: class

下一个主题Java 教程