更新時間:2022-12-05 11:31:34 來源:動力節點 瀏覽2676次
在 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天面授
有基礎 直達就業
業余時間 高薪轉行
工作1~3年,加薪神器
工作3~5年,晉升架構
提交申請后,顧問老師會電話與您溝通安排學習