专注Java教育14年 全国咨询/投诉热线:444-1124-454
赢咖4LOGO图
始于2009,口口相传的Java黄埔军校
首页 学习攻略 Java学习 Java读取xml文件内容的方法

Java读取xml文件内容的方法

更新时间:2022-12-05 11:31:34 来源:赢咖4 浏览1966次

在 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

<?xml version="1.0"?>  
<class>  
    <student>  
        <id>101</id>  
        <firstname>Naman</firstname>  
        <lastname>Kumar</lastname>  
        <subject>Math</subject>  
        <marks>83</marks>  
    </student>        
    <student>  
        <id>102</id>  
        <firstname>Kapil</firstname>  
        <lastname>Kumar</lastname>  
        <subject>Chemistry</subject>  
        <marks>60</marks>  
    </student>    
    <student>  
        <id>103</id>  
        <firstname>Harsh</firstname>  
        <lastname>Singh</lastname>  
        <subject>English</subject>  
        <marks>70</marks>  
    </student>    
    <student>  
        <id>104</id>  
        <firstname>Jitesh</firstname>  
        <lastname>Singh</lastname>  
        <subject>Physics</subject>  
        <marks>76</marks>  
    </student>    
</class>  

使用 DOM Parser 读取 XML 文件的示例

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;  
import java.io.File;  
public class ReadXMLFileExample1  
{  
public static void main(String argv[])   
{  
try   
{  
//creating a constructor of file class and parsing an XML file  
File file = new File("F:\\XMLFile.xml");  
//an instance of factory that gives a document builder  
DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();  
//an instance of builder to parse the specified xml file  
DocumentBuilder db = dbf.newDocumentBuilder();  
Document doc = db.parse(file);  
doc.getDocumentElement().normalize();  
System.out.println("Root element: " + doc.getDocumentElement().getNodeName());  
NodeList nodeList = doc.getElementsByTagName("student");  
// nodeList is not iterable, so we are using for loop  
for (int itr = 0; itr < nodeList.getLength(); itr++)   
{  
Node node = nodeList.item(itr);  
System.out.println("\nNode Name :" + node.getNodeName());  
if (node.getNodeType() == Node.ELEMENT_NODE)   
{  
Element eElement = (Element) node;  
System.out.println("Student id: "+ eElement.getElementsByTagName("id").item(0).getTextContent());  
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("Subject: "+ eElement.getElementsByTagName("subject").item(0).getTextContent());  
System.out.println("Marks: "+ eElement.getElementsByTagName("marks").item(0).getTextContent());  
}  
}  
}   
catch (Exception e)   
{  
e.printStackTrace();  
}  
}  
}  

输出

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 Parser 读取 XML 文件的示例

以下示例读取同一个 XML 文件XMLFile.xml,并展示如何逐一循环节点。它打印节点值、名称和属性(如果有)。

例子

导入 java.io.文件;  
导入 javax.xml.parsers.DocumentBuilder;  
导入 javax.xml.parsers.DocumentBuilderFactory;  
导入 org.w3c.dom.Document;  
导入 org.w3c.dom.NamedNodeMap;  
导入 org.w3c.dom.Node;  
导入 org.w3c.dom.NodeList;  
公共类 ReadXMLFileExample2   
{  
public static void  main(String[] args)    
{  
尝试   
{  
文件 file =  new  File( "F:\\XMLFile.xml" );  
DocumentBuilder documentBuilder = DocumentBuilderFactory.newInstance().newDocumentBuilder();  
文档 document = documentBuilder.parse(file);  
System.out.println( "根元素: " + document.getDocumentElement().getNodeName());  
如果 (文档.hasChildNodes())   
{  
printNodeList(document.getChildNodes());  
}  
}   
抓住 (例外 e)  
{  
System.out.println(e.getMessage());  
}  
}  
private static void  printNodeList(NodeList 节点列表)    
{  
for  ( int  count =  0 ; count < nodeList.getLength(); count++)   
{  
节点 elemNode = nodeList.item(count);  
如果 (elemNode.getNodeType() == Node.ELEMENT_NODE)   
{  
// 获取节点名称和值  
System.out.println( "\n节点名称 = "  + elemNode.getNodeName()+  " [OPEN]" );  
System.out.println( "节点内容 = "  + elemNode.getTextContent());  
如果 (elemNode.hasAttributes())   
{  
NamedNodeMap nodeMap = elemNode.getAttributes();  
for  ( int  i =  0 ; i < nodeMap.getLength(); i++)   
{  
节点node = nodeMap.item(i);  
System.out.println( "属性名称:"  + node.getNodeName());  
System.out.println( "属性值:"  + node.getNodeValue());  
}  
}  
如果 (elemNode.hasChildNodes())   
{  
//如果节点有子节点则递归调用  
printNodeList(elemNode.getChildNodes());  
}  
System.out.println( "节点名称 = "  + elemNode.getNodeName()+  " [CLOSE]" );  
}  
}  
}  
}  

输出

根元素:class
节点名称 =class [OPEN]
节点内容 = 	
		101 
		Naman 
		Kumar 
		Maths 
		83 	
		102 
		Kapil 
		Kumar 
		Chemistry 
		60 	
		103 
		Harsh 
		Singh 
		English 
		70 	
		104 
		Jitesh 
		Singh 
		Physics 
		76	
节点名称 =student [OPEN]
节点内容 = 
		101 
		Naman 
		Kumar 
		Maths 
		83	
节点Name =id [OPEN] 
Node Content =101 
Node Name =id [CLOSE] 
Node Name =firstname [OPEN] 
Node Content =Naman
节点名称 =firstname [关闭]
节点名称 =lastname [打开]
节点内容 =Kumar
节点名称 =lastname [关闭]
节点名称 =subject [打开]
节点内容 =Math
节点名称 =subject [关闭]
节点名称 =marks [打开]
节点内容 =83
节点名称 =marks [关闭]
节点名称 =student [关闭]
节点名称 =student [打开]
节点内容 = 
		102 
		Kapil 
		Kumar 
		Chemistry 
		60	
节点名称 =id [打开]
节点内容 =102
节点名称 =id [关闭] ] 
Node Name =firstname [OPEN] 
Node Content =Kapil 
Node Name =firstname [CLOSE] 
Node Name =lastname [OPEN]
节点内容=Kumar
节点名称=lastname [CLOSE]
节点名称=subject [OPEN]
节点内容=Chemistry
节点名称=subject [CLOSE]
节点名称=marks [OPEN]
节点内容=60
节点名称=marks [CLOSE]
节点名称= student [CLOSE]
节点名称 =student [OPEN]
节点内容 = 
		103 
		Harsh 
		Singh 
		English 
		70	
节点名称 =id [OPEN]
节点内容 =103
节点名称 =id [CLOSE]
节点名称 =firstname [OPEN]
节点内容 =Harsh
节点名称=firstname [CLOSE] 
Node Name =lastname [OPEN] 
Node Content =Singh 
Node Name =lastname [关闭]
节点名称=subject [OPEN]
节点内容=English
节点名称=subject [CLOSE]
节点名称=marks [OPEN]
节点内容=70
节点名称=marks [CLOSE]
节点名称=student [CLOSE]
节点名称=student [OPEN]
节点内容= 
		104 
		Jitesh 
		Singh 
		Physics 
		76	
节点名称=id [打开]
节点内容=104
节点名称=id [关闭]
节点名称=名字[打开]
节点内容=Jitesh
节点名称=名字[关闭]
节点名称=姓氏[打开] ]
节点内容 =Singh
节点名称 =姓氏 [关闭]
节点名称 =主题 [打开]
节点内容 =物理
节点名称=subject [CLOSE]
节点名称=marks [OPEN]
节点内容=76
节点名称=marks [CLOSE]
节点名称=student [CLOSE]
节点名称=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 文件的示例

导入 javax.xml.parsers.SAXParser;  
导入 javax.xml.parsers.SAXParserFactory;  
导入 org.xml.sax.Attributes;  
导入 org.xml.sax.SAXException;  
导入 org.xml.sax.helpers.DefaultHandler;  
公共类 ReadXMLFileExample3   
{  
public static void  main(String args[])     
{  
尝试   
{  
SAXParserFactory factory = SAXParserFactory.newInstance();  
SAXParser saxParser = factory.newSAXParser();  
DefaultHandler 处理程序 =  new  DefaultHandler()   
{  
布尔 id =  false ;  
布尔 名 =  false ;  
布尔 姓氏= 假;  
布尔 主题= 假;  
布尔 标记 =  false ;  
//解析器开始解析文档中的特定元素    
public void  startElement(String uri, String localName, String qName, Attributes attributes) 抛出 SAXException    
{  
System.out.println( "开始元素:"  + qName);  
如果(qName.equalsIgnoreCase(“Id” ))  
{  
编号=真;  
}  
如果 (qName.equalsIgnoreCase(“FIRSTNAME” ))   
{  
名字= 真;  
}  
如果 (qName.equalsIgnoreCase(“LASTNAME” ))   
{  
姓氏 = 真;  
}  
如果 (qName.equalsIgnoreCase(“主题” ))   
{  
主题= 真;  
}  
如果 (qName.equalsIgnoreCase(“MARKS” ))   
{  
标记= 真;  
}  
}  
//解析器结束解析文档中的特定元素  
public void  endElement(String uri, String localName, String qName) 抛出 SAXException    
{  
System.out.println( "结束元素:"  + qName);  
}  
//读取当前解析元素的文本值  
public void  characters( char  ch[],  int  start,  int  length) 抛出 SAXException    
{  
如果 (编号)   
{  
System.out.println( "ID : "  +  new  String(ch, start, length));  
编号 = 假;  
}  
如果 (名字)   
{  
System.out.println( "名字:"  +  new  String(ch, start, length));  
名字= 假;  
}  
如果 (姓氏)   
{  
System.out.println( "姓氏:"  +  new  String(ch, start, length));  
姓氏 = 假;  
}  
如果 (主题)  
{  
System.out.println( "主题: "  +  new  String(ch, start, length));  
主题= 假;  
}  
如果 (标记)   
{  
System.out.println( "标记 : "  +  new  String(ch, start, length));  
标记= 假;  
}  
}  
};  
saxParser.parse( "F:\\XMLFile.xml" , handler);  
}   
抓住 (例外 e)   
{  
e.printStackTrace();  
}  
}  
}  

输出

开始元素:class
开始元素:student
开始元素:id 
ID:101
结束元素:id
开始元素:firstname 
First Name:Naman
结束元素:firstname
开始元素:lastname 
Last Name:Kumar
结束元素:lastname
开始元素:subject
主题:Math
结束元素:subject
开始元素:marks
标记:83
结束元素:marks
结束元素:student
开始元素:student
开始元素:id 
ID:102
结束元素:id
开始元素:firstname
名字:Kapil
结束元素:firstname
开始元素:lastname
姓氏:Kumar
结束元素:lastname
开始元素:subject
主题:Chemistry
结束元素:subject
开始元素:marks 
Marks:60
结束元素:marks
结束元素:student
开始元素:student
开始元素:id 
ID:103
结束元素:id
开始元素:firstname
名字:Harsh
结束元素:firstname
开始元素:lastname 姓氏
:Singh
结束元素:lastname
开始元素:subject 
Subject:English
结束元素:subject
开始元素:marks 
Marks:70
结束元素:marks
结束元素:student
开始元素:student
开始元素:id 
ID:104
结束元素:id
开始元素:firstname
名字:Jitesh
结束元素:firstname
开始元素:lastname 姓氏
:Singh
结束元素:lastname
开始元素:subject
主题:Physics
结束元素:subject
开始元素:marks 
Marks:76
结束元素:marks
结束元素:student
结束元素:class

以上就是关于“Java读取xml文件内容的方法”介绍,大家如果想了解更多相关知识,不妨来关注一下赢咖4的Java视频,里面的课程内容详细,通俗易懂,适合小白学习,希望对大家能够有所帮助。

提交申请后,顾问老师会电话与您沟通安排学习

免费课程推荐 >>
技术文档推荐 >>