欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

JAVA日常開發(fā)中讀寫XML的方法詳解

 更新時(shí)間:2024年12月24日 08:28:56   作者:xcLeigh  
這篇文章主要介紹了JAVA日常開發(fā)中讀寫XML的相關(guān)資料,詳細(xì)講解了在Java中如何使用DOM(文檔對(duì)象模型)和SAX(簡單API?for?XML)兩種方式讀取XML文件,以及如何使用DOM和JAXB(Java?Architecture?for?XML?Binding)兩種方式寫入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接口的方式

    這篇文章主要介紹了淺談java調(diào)用Restful API接口的方式,具有一定借鑒價(jià)值,需要的朋友可以參考下。
    2017-12-12
  • netty中pipeline的handler添加刪除分析

    netty中pipeline的handler添加刪除分析

    這篇文章主要為大家介紹了netty中pipeline的handler添加刪除分析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-04-04
  • idea打開項(xiàng)目后無法顯示目錄結(jié)構(gòu),只能顯示.iml文件問題

    idea打開項(xiàng)目后無法顯示目錄結(jié)構(gòu),只能顯示.iml文件問題

    這篇文章主要介紹了idea打開項(xiàng)目后無法顯示目錄結(jié)構(gòu),只能顯示.iml文件問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2024-08-08
  • javaweb中mysql數(shù)據(jù)庫連接步驟方法及其實(shí)例

    javaweb中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詳解

    如何在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-05
  • SpringCloud gateway+zookeeper實(shí)現(xiàn)網(wǎng)關(guān)路由的詳細(xì)搭建

    SpringCloud 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-08
  • 深入了解Spring中的FactoryBean

    深入了解Spring中的FactoryBean

    這篇文章主要介紹了深入了解Spring中的FactoryBean,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2019-09-09
  • Java數(shù)據(jù)結(jié)構(gòu)之ArrayList從順序表到實(shí)現(xiàn)

    Java數(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-04
  • 深入解析Spring?Boot?的SPI機(jī)制詳情

    深入解析Spring?Boot?的SPI機(jī)制詳情

    這篇文章主要介紹了深入解析Spring?Boot的SPI機(jī)制詳情,SPI是JDK內(nèi)置的一種服務(wù)提供發(fā)現(xiàn)機(jī)制,可以用來啟用框架擴(kuò)展和替換組件,主要用于框架中開發(fā),更多相關(guān)介紹,感興趣的小伙伴可以參考一下下面文章內(nèi)容
    2022-08-08
  • Springboot?通過FastJson實(shí)現(xiàn)bean對(duì)象和Json字符串互轉(zhuǎn)問題

    Springboot?通過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

最新評(píng)論