更新時(shí)間:2022-12-05 11:31:34 來源:動(dòng)力節(jié)點(diǎn) 瀏覽2814次
在 Java 中讀取 XML 文件與讀取其他文件(如 .docx 和 .txt)有很大不同,因?yàn)?XML 文件包含標(biāo)簽之間的數(shù)據(jù)。Java 提供了許多解析 XML 文件讀取的方法。Java 中有兩個(gè)解析器可以解析 XML 文件:
Java DOM解析器
Java SAX解析器
Java DOM 解析器
DOM API提供了讀取和寫入 XML 文件的類。我們可以使用 DOM API 創(chuàng)建、刪除、修改和重新排列節(jié)點(diǎn)。DOM 解析器解析整個(gè) XML 文件并在內(nèi)存中創(chuàng)建一個(gè)DOM對(duì)象。它以樹結(jié)構(gòu)對(duì)XML 文件進(jìn)行建模,以便于遍歷和操作。在 DOM 中,XML 文件中的所有內(nèi)容都是一個(gè)節(jié)點(diǎn)。該節(jié)點(diǎn)表示 XML 文件的一個(gè)組件。DOM 解析器在將 XML 文件加載到內(nèi)存中時(shí),處理速度很慢并且占用大量?jī)?nèi)存。
我們一定是按照 Java 讀取 XML 文件的流程:
實(shí)例化 XML 文件: DOM 解析器將 XML 文件加載到內(nèi)存中,并將每個(gè)標(biāo)簽視為一個(gè)元素。
獲取根節(jié)點(diǎn): Document類提供了getDocumentElement()方法來獲取根節(jié)點(diǎn)和XML文件的元素。
獲取所有節(jié)點(diǎn): getElementByTagName ()方法從 XML 文件中檢索所有特定的標(biāo)簽名稱。其中ELEMENT_NODE類型是指具有子元素的非文本節(jié)點(diǎn)。如果我們需要從頭開始訪問所有節(jié)點(diǎn),包括根節(jié)點(diǎn),我們可以遞歸調(diào)用getChildElement()方法。
按文本值獲取節(jié)點(diǎn):我們可以使用getElementByTextValue()方法按值搜索節(jié)點(diǎn)。
通過屬性值獲取節(jié)點(diǎn):如果我們想通過特定屬性的值搜索節(jié)點(diǎn),我們可以使用 getElementByTagName() 方法和 getAttribute() 方法。
第 1 步:創(chuàng)建一個(gè)簡(jiǎn)單的Java項(xiàng)目。
第 2 步:創(chuàng)建類文件并提供類文件名。我們已經(jīng)創(chuàng)建了名為ReadXMLFileExample1的類文件。
第 3 步:編寫如下代碼。
第 4 步:下載dom-2.3.0-jaxb-1.0.6.jar文件:?jiǎn)螕舸颂?..
第 5 步:在項(xiàng)目中創(chuàng)建一個(gè)lib文件夾。
第 6 步:復(fù)制dom-2.3.0-jaxb-1.0.6.jar文件并粘貼到 lib 文件夾中。
第 7 步:設(shè)置類路徑:
右擊項(xiàng)目->Build Path->Configure Build Path->Add External JARs->選擇JAR文件->點(diǎn)擊Open按鈕->Apply and Close。
第 8 步:創(chuàng)建XML文件。我們創(chuàng)建了一個(gè)名為XMLFile.xml的 XML 文件,并將以下數(shù)據(jù)寫入其中。
第 9 步:運(yùn)行項(xiàng)目。
創(chuàng)建 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
讓我們看另一個(gè)讀取 xml 文件的例子。
以下示例讀取同一個(gè) XML 文件XMLFile.xml,并展示如何逐一循環(huán)節(jié)點(diǎn)。它打印節(jié)點(diǎn)值、名稱和屬性(如果有)。
例子
導(dǎo)入 java.io.文件;
導(dǎo)入 javax.xml.parsers.DocumentBuilder;
導(dǎo)入 javax.xml.parsers.DocumentBuilderFactory;
導(dǎo)入 org.w3c.dom.Document;
導(dǎo)入 org.w3c.dom.NamedNodeMap;
導(dǎo)入 org.w3c.dom.Node;
導(dǎo)入 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 節(jié)點(diǎn)列表)
{
for ( int count = 0 ; count < nodeList.getLength(); count++)
{
節(jié)點(diǎn) elemNode = nodeList.item(count);
如果 (elemNode.getNodeType() == Node.ELEMENT_NODE)
{
// 獲取節(jié)點(diǎn)名稱和值
System.out.println( "\n節(jié)點(diǎn)名稱 = " + elemNode.getNodeName()+ " [OPEN]" );
System.out.println( "節(jié)點(diǎn)內(nèi)容 = " + elemNode.getTextContent());
如果 (elemNode.hasAttributes())
{
NamedNodeMap nodeMap = elemNode.getAttributes();
for ( int i = 0 ; i < nodeMap.getLength(); i++)
{
節(jié)點(diǎn)node = nodeMap.item(i);
System.out.println( "屬性名稱:" + node.getNodeName());
System.out.println( "屬性值:" + node.getNodeValue());
}
}
如果 (elemNode.hasChildNodes())
{
//如果節(jié)點(diǎn)有子節(jié)點(diǎn)則遞歸調(diào)用
printNodeList(elemNode.getChildNodes());
}
System.out.println( "節(jié)點(diǎn)名稱 = " + elemNode.getNodeName()+ " [CLOSE]" );
}
}
}
}
輸出
根元素:class
節(jié)點(diǎn)名稱 =class [OPEN]
節(jié)點(diǎn)內(nèi)容 =
101
Naman
Kumar
Maths
83
102
Kapil
Kumar
Chemistry
60
103
Harsh
Singh
English
70
104
Jitesh
Singh
Physics
76
節(jié)點(diǎn)名稱 =student [OPEN]
節(jié)點(diǎn)內(nèi)容 =
101
Naman
Kumar
Maths
83
節(jié)點(diǎn)Name =id [OPEN]
Node Content =101
Node Name =id [CLOSE]
Node Name =firstname [OPEN]
Node Content =Naman
節(jié)點(diǎn)名稱 =firstname [關(guān)閉]
節(jié)點(diǎn)名稱 =lastname [打開]
節(jié)點(diǎn)內(nèi)容 =Kumar
節(jié)點(diǎn)名稱 =lastname [關(guān)閉]
節(jié)點(diǎn)名稱 =subject [打開]
節(jié)點(diǎn)內(nèi)容 =Math
節(jié)點(diǎn)名稱 =subject [關(guān)閉]
節(jié)點(diǎn)名稱 =marks [打開]
節(jié)點(diǎn)內(nèi)容 =83
節(jié)點(diǎn)名稱 =marks [關(guān)閉]
節(jié)點(diǎn)名稱 =student [關(guān)閉]
節(jié)點(diǎn)名稱 =student [打開]
節(jié)點(diǎn)內(nèi)容 =
102
Kapil
Kumar
Chemistry
60
節(jié)點(diǎn)名稱 =id [打開]
節(jié)點(diǎn)內(nèi)容 =102
節(jié)點(diǎn)名稱 =id [關(guān)閉] ]
Node Name =firstname [OPEN]
Node Content =Kapil
Node Name =firstname [CLOSE]
Node Name =lastname [OPEN]
節(jié)點(diǎn)內(nèi)容=Kumar
節(jié)點(diǎn)名稱=lastname [CLOSE]
節(jié)點(diǎn)名稱=subject [OPEN]
節(jié)點(diǎn)內(nèi)容=Chemistry
節(jié)點(diǎn)名稱=subject [CLOSE]
節(jié)點(diǎn)名稱=marks [OPEN]
節(jié)點(diǎn)內(nèi)容=60
節(jié)點(diǎn)名稱=marks [CLOSE]
節(jié)點(diǎn)名稱= student [CLOSE]
節(jié)點(diǎn)名稱 =student [OPEN]
節(jié)點(diǎn)內(nèi)容 =
103
Harsh
Singh
English
70
節(jié)點(diǎn)名稱 =id [OPEN]
節(jié)點(diǎn)內(nèi)容 =103
節(jié)點(diǎn)名稱 =id [CLOSE]
節(jié)點(diǎn)名稱 =firstname [OPEN]
節(jié)點(diǎn)內(nèi)容 =Harsh
節(jié)點(diǎn)名稱=firstname [CLOSE]
Node Name =lastname [OPEN]
Node Content =Singh
Node Name =lastname [關(guān)閉]
節(jié)點(diǎn)名稱=subject [OPEN]
節(jié)點(diǎn)內(nèi)容=English
節(jié)點(diǎn)名稱=subject [CLOSE]
節(jié)點(diǎn)名稱=marks [OPEN]
節(jié)點(diǎn)內(nèi)容=70
節(jié)點(diǎn)名稱=marks [CLOSE]
節(jié)點(diǎn)名稱=student [CLOSE]
節(jié)點(diǎn)名稱=student [OPEN]
節(jié)點(diǎn)內(nèi)容=
104
Jitesh
Singh
Physics
76
節(jié)點(diǎn)名稱=id [打開]
節(jié)點(diǎn)內(nèi)容=104
節(jié)點(diǎn)名稱=id [關(guān)閉]
節(jié)點(diǎn)名稱=名字[打開]
節(jié)點(diǎn)內(nèi)容=Jitesh
節(jié)點(diǎn)名稱=名字[關(guān)閉]
節(jié)點(diǎn)名稱=姓氏[打開] ]
節(jié)點(diǎn)內(nèi)容 =Singh
節(jié)點(diǎn)名稱 =姓氏 [關(guān)閉]
節(jié)點(diǎn)名稱 =主題 [打開]
節(jié)點(diǎn)內(nèi)容 =物理
節(jié)點(diǎn)名稱=subject [CLOSE]
節(jié)點(diǎn)名稱=marks [OPEN]
節(jié)點(diǎn)內(nèi)容=76
節(jié)點(diǎn)名稱=marks [CLOSE]
節(jié)點(diǎn)名稱=student [CLOSE]
節(jié)點(diǎn)名稱=class [CLOSE]
Java SAX 解析器代表Simple API for XML。SAX 解析器逐行解析 XML 文件。它在遇到 xml 文件中的開始標(biāo)記、結(jié)束標(biāo)記和字符數(shù)據(jù)時(shí)觸發(fā)事件。SAX 解析器也稱為基于事件的解析器。
SAX 解析器不會(huì)將任何 XML 文件加載到內(nèi)存中。它不創(chuàng)建 XML 文檔的任何對(duì)象表示。SAX 解析器使用回調(diào)函數(shù)通知客戶端 XML 文檔結(jié)構(gòu)。它比 DOM 解析器更快并且使用更少的內(nèi)存。
SAX 是 XML 的流式接口,這意味著 XML 文件按順序解析,從文檔頂部開始,到根元素結(jié)束為止。
使用 SAX 解析器讀取 XML 文件的示例
導(dǎo)入 javax.xml.parsers.SAXParser;
導(dǎo)入 javax.xml.parsers.SAXParserFactory;
導(dǎo)入 org.xml.sax.Attributes;
導(dǎo)入 org.xml.sax.SAXException;
導(dǎo)入 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 ;
布爾 姓氏= 假;
布爾 主題= 假;
布爾 標(biāo)記 = false ;
//解析器開始解析文檔中的特定元素
public void startElement(String uri, String localName, String qName, Attributes attributes) 拋出 SAXException
{
System.out.println( "開始元素:" + qName);
如果(qName.equalsIgnoreCase(“Id” ))
{
編號(hào)=真;
}
如果 (qName.equalsIgnoreCase(“FIRSTNAME” ))
{
名字= 真;
}
如果 (qName.equalsIgnoreCase(“LASTNAME” ))
{
姓氏 = 真;
}
如果 (qName.equalsIgnoreCase(“主題” ))
{
主題= 真;
}
如果 (qName.equalsIgnoreCase(“MARKS” ))
{
標(biāo)記= 真;
}
}
//解析器結(jié)束解析文檔中的特定元素
public void endElement(String uri, String localName, String qName) 拋出 SAXException
{
System.out.println( "結(jié)束元素:" + qName);
}
//讀取當(dāng)前解析元素的文本值
public void characters( char ch[], int start, int length) 拋出 SAXException
{
如果 (編號(hào))
{
System.out.println( "ID : " + new String(ch, start, length));
編號(hào) = 假;
}
如果 (名字)
{
System.out.println( "名字:" + new String(ch, start, length));
名字= 假;
}
如果 (姓氏)
{
System.out.println( "姓氏:" + new String(ch, start, length));
姓氏 = 假;
}
如果 (主題)
{
System.out.println( "主題: " + new String(ch, start, length));
主題= 假;
}
如果 (標(biāo)記)
{
System.out.println( "標(biāo)記 : " + new String(ch, start, length));
標(biāo)記= 假;
}
}
};
saxParser.parse( "F:\\XMLFile.xml" , handler);
}
抓住 (例外 e)
{
e.printStackTrace();
}
}
}
輸出
開始元素:class
開始元素:student
開始元素:id
ID:101
結(jié)束元素:id
開始元素:firstname
First Name:Naman
結(jié)束元素:firstname
開始元素:lastname
Last Name:Kumar
結(jié)束元素:lastname
開始元素:subject
主題:Math
結(jié)束元素:subject
開始元素:marks
標(biāo)記:83
結(jié)束元素:marks
結(jié)束元素:student
開始元素:student
開始元素:id
ID:102
結(jié)束元素:id
開始元素:firstname
名字:Kapil
結(jié)束元素:firstname
開始元素:lastname
姓氏:Kumar
結(jié)束元素:lastname
開始元素:subject
主題:Chemistry
結(jié)束元素:subject
開始元素:marks
Marks:60
結(jié)束元素:marks
結(jié)束元素:student
開始元素:student
開始元素:id
ID:103
結(jié)束元素:id
開始元素:firstname
名字:Harsh
結(jié)束元素:firstname
開始元素:lastname 姓氏
:Singh
結(jié)束元素:lastname
開始元素:subject
Subject:English
結(jié)束元素:subject
開始元素:marks
Marks:70
結(jié)束元素:marks
結(jié)束元素:student
開始元素:student
開始元素:id
ID:104
結(jié)束元素:id
開始元素:firstname
名字:Jitesh
結(jié)束元素:firstname
開始元素:lastname 姓氏
:Singh
結(jié)束元素:lastname
開始元素:subject
主題:Physics
結(jié)束元素:subject
開始元素:marks
Marks:76
結(jié)束元素:marks
結(jié)束元素:student
結(jié)束元素:class
以上就是關(guān)于“Java讀取xml文件內(nèi)容的方法”介紹,大家如果想了解更多相關(guān)知識(shí),不妨來關(guān)注一下動(dòng)力節(jié)點(diǎn)的Java視頻,里面的課程內(nèi)容詳細(xì),通俗易懂,適合小白學(xué)習(xí),希望對(duì)大家能夠有所幫助。
相關(guān)閱讀
0基礎(chǔ) 0學(xué)費(fèi) 15天面授
有基礎(chǔ) 直達(dá)就業(yè)
業(yè)余時(shí)間 高薪轉(zhuǎn)行
工作1~3年,加薪神器
工作3~5年,晉升架構(gòu)
提交申請(qǐng)后,顧問老師會(huì)電話與您溝通安排學(xué)習(xí)