更新时间:2022-12-05 11:31:34 来源:极悦 浏览2104次
在 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() 方法。
第 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>
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 文件的例子。
以下示例读取同一个 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 解析器代表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文件内容的方法”介绍,大家如果想了解更多相关知识,不妨来关注一下极悦的Java视频,里面的课程内容详细,通俗易懂,适合小白学习,希望对大家能够有所帮助。
0基础 0学费 15天面授
Java就业班有基础 直达就业
业余时间 高薪转行
Java在职加薪班工作1~3年,加薪神器
工作3~5年,晋升架构
提交申请后,顾问老师会电话与您沟通安排学习