JAVA日常開發(fā)中讀寫XML的方法詳解
前言
在數(shù)字浪潮洶涌澎湃的時(shí)代,程序開發(fā)宛如一座神秘而宏偉的魔法城堡,矗立在科技的浩瀚星空中。代碼的字符,似那閃爍的星辰,按照特定的軌跡與節(jié)奏,組合、交織、碰撞,即將開啟一場(chǎng)奇妙且充滿無限可能的創(chuàng)造之旅。當(dāng)空白的文檔界面如同深邃的宇宙等待探索,程序員們則化身無畏的星辰開拓者,指尖在鍵盤上輕舞,準(zhǔn)備用智慧與邏輯編織出足以改變世界運(yùn)行規(guī)則的程序畫卷,在 0 和 1 的二進(jìn)制世界里,鐫刻下屬于人類創(chuàng)新與突破的不朽印記。
一、XML 簡介
XML(eXtensible Markup Language)是一種可擴(kuò)展標(biāo)記語言,它被設(shè)計(jì)用來傳輸和存儲(chǔ)數(shù)據(jù)。XML 的結(jié)構(gòu)類似于 HTML,都是由標(biāo)簽組成,但 XML 的標(biāo)簽是可以自定義的,這使得它具有很強(qiáng)的靈活性。
- 例如,一個(gè)簡單的 XML 文件可以用來存儲(chǔ)書籍信息:
<?xml version="1.0" encoding="UTF-8"?> <bookstore> <book category="cooking"> <title lang="en">Everyday Italian</title> <author>Giada De Laurentiis</author> <year>2005</year> <price>30.00</price> </book> </bookstore>
在這個(gè)例子中,<?xml version="1.0" encoding="UTF-8"?>是 XML 的聲明,它定義了 XML 的版本和編碼方式。是根元素,是子元素,并且元素有一個(gè)屬性category。
二、在 Java 中讀取 XML
2.1 使用 DOM(Document Object Model)方式讀取 XML
DOM 方式會(huì)將整個(gè) XML 文檔加載到內(nèi)存中,形成一個(gè)樹形結(jié)構(gòu),然后可以通過遍歷這個(gè)樹形結(jié)構(gòu)來獲取 XML 中的數(shù)據(jù)。
首先,需要導(dǎo)入相關(guān)的 Java XML 庫。在 Java 中,主要是org.w3c.dom和javax.xml.parsers包。
- 以下是一個(gè)簡單的讀取 XML 文件并獲取其中書籍標(biāo)題的示例代碼:
import javax.xml.parsers.DocumentBuilder; import javax.xml.parsers.DocumentBuilderFactory; import org.w3c.dom.Document; import org.w3c.dom.Element; import org.w3c.dom.Node; import org.w3c.dom.NodeList; import java.io.File; public class ReadXMLWithDOM { public static void main(String[] args) { try { File xmlFile = new File("books.xml"); DocumentBuilderFactory dbFactory = DocumentBuilderFactory.newInstance(); DocumentBuilder dBuilder = dbFactory.newDocumentBuilder(); Document doc = dBuilder.parse(xmlFile); doc.getDocumentElement().normalize(); NodeList nList = doc.getElementsByTagName("book"); for (int i = 0; i < nList.getLength(); i++) { Node nNode = nList.item(i); if (nNode.getNodeType() == Node.ELEMENT_NODE) { Element eElement = (Element) nNode; System.out.println("Book title: " + eElement.getElementsByTagName("title").item(0).getTextContent()); } } } catch (Exception e) { e.printStackTrace(); } } }
上述代碼首先創(chuàng)建一個(gè)DocumentBuilderFactory對(duì)象,然后使用它創(chuàng)建一個(gè)DocumentBuilder。通過DocumentBuilder的parse方法將 XML 文件解析為一個(gè)Document對(duì)象。Document對(duì)象代表了整個(gè) XML 文檔的樹形結(jié)構(gòu)。通過getElementsByTagName方法可以獲取具有指定標(biāo)簽名的節(jié)點(diǎn)列表,然后遍歷這個(gè)列表來獲取每個(gè)元素中的
2.2 使用 SAX(Simple API for XML)方式讀取 XML
SAX 是一種基于事件驅(qū)動(dòng)的 XML 解析方式。它不會(huì)將整個(gè) XML 文檔加載到內(nèi)存中,而是在解析 XML 文檔的過程中,當(dāng)遇到特定的 XML 結(jié)構(gòu)(如開始標(biāo)簽、結(jié)束標(biāo)簽、文本內(nèi)容等)時(shí),會(huì)觸發(fā)相應(yīng)的事件,通過定義事件處理器來處理這些事件,從而獲取 XML 中的數(shù)據(jù)。
要使用 SAX,需要實(shí)現(xiàn)org.xml.sax.ContentHandler接口來定義事件處理器。以下是一個(gè)簡單的示例,用于統(tǒng)計(jì) XML 文件中書籍的數(shù)量:
import org.xml.sax.Attributes; import org.xml.sax.SAXException; import org.xml.sax.helpers.DefaultHandler; import javax.xml.parsers.SAXParser; import javax.xml.parsers.SAXParserFactory; import java.io.File; public class ReadXMLWithSAX { public static void main(String[] args) { try { File xmlFile = new File("books.xml"); SAXParserFactory factory = SAXParserFactory.newInstance(); SAXParser saxParser = factory.newSAXParser(); MyHandler handler = new MyHandler(); saxParser.parse(xmlFile, handler); System.out.println("Number of books: " + handler.getBookCount()); } catch (Exception e) { e.printStackTrace(); } } } class MyHandler extends DefaultHandler { private int bookCount = 0; @Override public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException { if (qName.equalsIgnoreCase("book")) { bookCount++; } } public int getBookCount() { return bookCount; } }
在這個(gè)示例中,MyHandler類繼承自DefaultHandler,并重寫了startElement方法。當(dāng) SAX 解析器遇到開始標(biāo)簽時(shí),會(huì)調(diào)用startElement方法。如果遇到標(biāo)簽,就會(huì)將bookCount加 1。最后,通過getBookCount方法獲取書籍的數(shù)量。
三、在 Java 中寫入 XML
3.1 使用 DOM 方式寫入 XML
- 以下是一個(gè)簡單的示例,用于創(chuàng)建一個(gè)新的 XML 文件并寫入書籍信息:
import javax.xml.parsers.DocumentBuilder; import javax.xml.parsers.DocumentBuilderFactory; import javax.xml.transform.Transformer; import javax.xml.transform.TransformerFactory; import javax.xml.transform.dom.DOMSource; import javax.xml.transform.stream.StreamResult; import org.w3c.dom.Document; import org.w3c.dom.Element; public class WriteXMLWithDOM { public static void main(String[] args) { try { DocumentBuilderFactory dbFactory = DocumentBuilderFactory.newInstance(); DocumentBuilder dBuilder = dbFactory.newDocumentBuilder(); Document doc = dBuilder.newDocument(); Element bookstore = doc.createElement("bookstore"); doc.appendChild(bookstore); Element book = doc.createElement("book"); bookstore.appendChild(book); Element title = doc.createElement("title"); title.setTextContent("New Book"); book.appendChild(title); TransformerFactory transformerFactory = TransformerFactory.newInstance(); Transformer transformer = transformerFactory.newTransformer(); DOMSource source = new DOMSource(doc); StreamResult result = new StreamResult(new File("new_books.xml")); transformer.transform(source, result); } catch (Exception e) { e.printStackTrace(); } } }
首先,通過DocumentBuilder創(chuàng)建一個(gè)新的Document對(duì)象。然后,使用createElement方法創(chuàng)建 XML 元素,并使用appendChild方法將元素添加到文檔樹中。設(shè)置好元素的文本內(nèi)容后,通過Transformer將Document對(duì)象轉(zhuǎn)換為 XML 文件并保存到磁盤上。
使用 JAXB(Java Architecture for XML Binding)方式寫入 XML
JAXB 提供了一種將 Java 對(duì)象與 XML 數(shù)據(jù)進(jìn)行相互轉(zhuǎn)換的機(jī)制。首先需要定義 Java 類來對(duì)應(yīng) XML 的結(jié)構(gòu)。
- 假設(shè)我們有一個(gè)Book類和一個(gè)Bookstore類來對(duì)應(yīng)上面的 XML 結(jié)構(gòu):
import javax.xml.bind.JAXBContext; import javax.xml.bind.JAXBException; import javax.xml.bind.Marshaller; import java.util.ArrayList; import java.util.List; class Book { private String title; private String author; private int year; private double price; // 構(gòu)造函數(shù)、getter和setter方法省略 } class Bookstore { private List<Book> books = new ArrayList<>(); public void addBook(Book book) { books.add(book); } // 其他方法省略 }
- 以下是使用 JAXB 將Bookstore對(duì)象轉(zhuǎn)換為 XML 并保存的示例代碼:
public class WriteXMLWithJAXB { public static void main(String[] args) { try { Bookstore bookstore = new Bookstore(); Book book = new Book(); book.setTitle("Another New Book"); book.setAuthor("New Author"); book.setYear(2024); book.setPrice(35.0); bookstore.addBook(book); JAXBContext jaxbContext = JAXBContext.newInstance(Bookstore.class); Marshaller jaxbMarshaller = jaxbContext.createMarshaller(); jaxbMarshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true); jaxbMarshaller.marshal(bookstore, new File("jaxb_books.xml")); } catch (JAXBException e) { e.printStackTrace(); } } }
在這個(gè)示例中,首先創(chuàng)建了Bookstore和Book對(duì)象,并設(shè)置了相關(guān)屬性。然后通過JAXBContext和Marshaller將Bookstore對(duì)象轉(zhuǎn)換為 XML 格式并保存到文件中。setProperty方法用于設(shè)置輸出格式為格式化后的 XML。
總結(jié)
到此這篇關(guān)于JAVA日常開發(fā)中讀寫XML的文章就介紹到這了,更多相關(guān)JAVA讀寫XML詳解內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
淺談java調(diào)用Restful API接口的方式
這篇文章主要介紹了淺談java調(diào)用Restful API接口的方式,具有一定借鑒價(jià)值,需要的朋友可以參考下。2017-12-12idea打開項(xiàng)目后無法顯示目錄結(jié)構(gòu),只能顯示.iml文件問題
這篇文章主要介紹了idea打開項(xiàng)目后無法顯示目錄結(jié)構(gòu),只能顯示.iml文件問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-08-08javaweb中mysql數(shù)據(jù)庫連接步驟方法及其實(shí)例
這篇文章主要介紹了使用java web 連接MySQL數(shù)據(jù)庫的驅(qū)動(dòng)方法的相關(guān)知識(shí),本文介紹的非常詳細(xì),具有參考借鑒價(jià)值,需要的朋友可以參考下2017-04-04如何在Spring中使用編碼方式動(dòng)態(tài)配置Bean詳解
這篇文章主要給大家介紹了關(guān)于如何在Spring中使用編碼方式動(dòng)態(tài)配置Bean的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2018-05-05SpringCloud gateway+zookeeper實(shí)現(xiàn)網(wǎng)關(guān)路由的詳細(xì)搭建
這篇文章主要介紹了SpringCloud gateway+zookeeper實(shí)現(xiàn)網(wǎng)關(guān)路由,本文通過圖文實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2022-08-08Java數(shù)據(jù)結(jié)構(gòu)之ArrayList從順序表到實(shí)現(xiàn)
Java中的ArrayList是一種基于數(shù)組實(shí)現(xiàn)的數(shù)據(jù)結(jié)構(gòu),支持動(dòng)態(tài)擴(kuò)容和隨機(jī)訪問元素,可用于實(shí)現(xiàn)順序表等數(shù)據(jù)結(jié)構(gòu)。ArrayList在內(nèi)存中連續(xù)存儲(chǔ)元素,支持快速的隨機(jī)訪問和遍歷。通過學(xué)習(xí)ArrayList的實(shí)現(xiàn)原理和使用方法,可以更好地掌握J(rèn)ava中的數(shù)據(jù)結(jié)構(gòu)和算法2023-04-04Springboot?通過FastJson實(shí)現(xiàn)bean對(duì)象和Json字符串互轉(zhuǎn)問題
這篇文章主要介紹了Springboot?通過FastJson實(shí)現(xiàn)bean對(duì)象和Json字符串互轉(zhuǎn),本文嘗試驗(yàn)證兩種場(chǎng)景給大家詳細(xì)介紹,對(duì)Springboot?FastJson實(shí)現(xiàn)bean和Json互轉(zhuǎn)問題,感興趣的朋友一起看看吧2022-08-08