java基礎之XML

来源:https://www.cnblogs.com/huizhipeng/archive/2018/12/11/10100113.html
-Advertisement-
Play Games

java基礎之XML 1. XML解析概述 2. DOM4J介紹 2.1 常用包 2.2 內置元素 2.2 Element類 2.3 Attribute類 2.4 常用操作 3. 代碼演示 3.1 DOM4J讀取xml文件 3.2 DOM4J創建xml文件 3.2 DOM4J修改xml文件 ...


目錄

java基礎之XML

XML是一種通用的數據交換格式,它的平臺無關性、語言無關性、系統無關性、給數據集成與交互帶來了極大的方便。本篇文章重點介紹DOM4J對XML文件的一些操作。

1. XML解析概述

  常見解析方式和解析器

  1. DOM:要求解析器把整個XML文檔裝載到記憶體,並解析成一個Document對象。
    優點:元素與元素之間保留結構關係,故可以進行增刪改查操作。
    缺點:XML文檔過大,可能出現記憶體溢出顯現。
  2. SAX:是一種速度更快,更有效的方法。它逐行掃描文檔,一邊掃描一邊解析。並以事件驅動的方式進行具體解析,每執行一行,都將觸發對應的事件。
    優點:處理速度快,可以處理大文件
    缺點:只能讀,逐行後將釋放資源。

2. DOM4J介紹

2.1 常用包

包名 作用
import org.dom4j.Document; Document文檔類
import org.dom4j.Element 元素節點類
import org.dom4j.QName; 一個對元素名字的封裝類
import org.dom4j.io.SAXReader; sax讀取類
import org.dom4j.io.XMLWriter xml寫入類
import org.dom4j.io.OutputFormat 輸出格式

2.2 內置元素

元素 含義
Attribute 定義了 XML 的屬性。
Branch 指能夠包含子節點的節點。如XML元素(Element)和文檔(Docuemnts)定義了一個公共的行為
CDATA 定義了 XML CDATA 區域
CharacterData 是一個標識介面,標識基於字元的節點。如CDATA,Comment, Text.
Comment 定義了 XML 註釋的行為
Document 定義了XML 文檔
DocumentType 定義 XML DOCTYPE 聲明
Element 定義XML 元素
ElementHandler 定義了Element 對象的處理器
ElementPath 被 ElementHandler 使用,用於取得當前正在處理的路徑層次信息
Entity 定義 XML entity
Node 為dom4j中所有的XML節點定義了多態行為
NodeFilter 定義了在dom4j 節點中產生的一個濾鏡或謂詞的行為(predicate)
ProcessingInstruction 定義 XML 處理指令
Text 定義 XML 文本節點
Visitor 用於實現 Visitor模式
XPath 在分析一個字元串後會提供一個 XPath 表達式

2.2 Element類

方法 含義
getQName() 元素的QName對象
getNamespace() 元素所屬的Namespace對象
getNamespacePrefix() 元素所屬的Namespace對象的prefix
getNamespaceURI() 元素所屬的Namespace對象的URI
getName() 元素的local name
getQualifiedName() 元素的qualified name
getText() 元素所含有的text內容,如果內容為空則返回一個空字元串而不是null
getTextTrim() 元素所含有的text內容,其中連續的空格被轉化為單個空格,該方法不會返回null
attributeIterator() 元素屬性的iterator,其中每個元素都是

2.3 Attribute類

方法 含義
attributeValue() 元素的某個指定屬性所含的值
elementIterator() 元素的子元素的iterator,其中每個元素都是Element對象
element() 元素的某個指定(qualified name或者local name)的子元素
elementText() 元素的某個指定(qualified name或者local name)的子元素中的text信息
getParent() 元素的父元素
getPath() 元素的XPath表達式,其中父元素的qualified name和子元素的qualified name之間使用”/”分隔
isTextOnly() 是否該元素只含有text或是空元素
isRootElement() 是否該元素是XML樹的根節點

2.4 常用操作

  • 讀取xml文件,獲得document對象.
SAXReader reader = new SAXReader();
Document  document = reader.read(new File("***.xml"));
  • 解析XML形式的文本,得到document對象.
String text = "<members></members>";
Document document = DocumentHelper.parseText(text);
  • 獲取根節點
Element root = dom.getRootElement();
  • 取得某節點的單個子節點
Element memberElm=root.element("title");
  • 獲取節點文字
String text=memberElm.getText();
  • 取得某節點下名為"title"所有位元組點併進行遍歷
List list = rootElm.elements("member");
Iterator<Element> it = list.iterator(); 
while(it.hasNext()){
   Element elm = it.next();
   // do something...
}
  • 在某節點下添加子節點.
Element ageElm = newMemberElm.addElement("age");
  • 設置節點文字.
ageElm.setText("29");
  • 刪除某節點.
parentElm.remove(childElm);
  • 取得某節點下的某屬性
    Element root=document.getRootElement();    
    Attribute attribute=root.attribute("id");
  • 設置某節點的屬性和文字.
newMemberElm.addAttribute("name", "sitinspring");
  • 設置屬性的文字
Attribute attribute=root.attribute("name");
attribute.setText("sitinspring");
  • 刪除某屬性
Attribute attribute=root.attribute("size");// 屬性名name
root.remove(attribute);

3. 代碼演示

3.1 DOM4J讀取xml文件

  test.xml

<?xml version="1.0" encoding="UTF-8"?>
<bookstore>
    <book id="1">
        <title>巴黎聖母院</title>
        <author>雨果</author>
    </book>
    <book id="2">
        <title>飄</title>
        <author>米切爾</author>
    </book>    
</bookstore>

  1. 使用List列表解析xml

import java.io.File;
import java.util.List;
import org.dom4j.Attribute;
import org.dom4j.Document;
import org.dom4j.Element;
import org.dom4j.io.SAXReader;
  
public class XmlDemo {
    public static void main(String[] args) throws Exception {
        SAXReader reader = new SAXReader();
        File file = new File("test.xml");
        Document document = reader.read(file);
        Element root = document.getRootElement();
        List<Element> childElements = root.elements();
        for (Element child : childElements) {
            //已知屬性名情況下
            System.out.println("--->id: " + child.attributeValue("id"));
            System.out.println("title:" + child.elementText("title"));
            System.out.println("author:" + child.elementText("author"));

            //未知屬性名情況下
            /*List<Attribute> attributeList = child.attributes();
            for (Attribute attr : attributeList) {
                System.out.println(attr.getName() + ": " + attr.getValue());
            }
            List<Element> elementList = child.elements();
            for (Element ele : elementList) {
                System.out.println(ele.getName() + ": " + ele.getText());
            }
            System.out.println();*/
           
        }
    }
}
//輸出結果:
--->id: 1
title:巴黎聖母院
author:雨果
--->id: 2
title:飄
author:米切爾

  2. 使用Iterator解析xml

public class XmlDemo {
    public static void main(String[] args) throws Exception {
        SAXReader reader = new SAXReader();
        Document document = reader.read(new File("test.xml"));
        Element root = document.getRootElement();
          
        Iterator<Element> it = root.elementIterator();
        while (it.hasNext()) {
            Element element = it.next();
            
            //未知屬性名稱情況下
            Iterator<Element> attrIt = element.attributeIterator();
            while (attrIt.hasNext()) {
                Attribute a  = (Attribute) attrIt.next();
                System.out.println(a.getValue());
            }
              
            Iterator<Element> eleIt = element.elementIterator();
            while (eleIt.hasNext()) {
                Element e =  eleIt.next();
                System.out.println(e.getName() + ": " + e.getText());
            }
            System.out.println();
              
            //已知元素名情況下  
            /*System.out.println("id: " + element.attributeValue("id"));
            System.out.println("title: " + element.elementText("title"));
            System.out.println("author: " + element.elementText("author"));
            System.out.println();*/
        }
    }
}
//輸出結果:
id: 1
title:巴黎聖母院
author:雨果

id: 2
title:飄
author:米切爾

3.2 DOM4J創建xml文件

public class XmlDemo {
    public static void main(String[] args) throws Exception {
        Document doc = DocumentHelper.createDocument();
        //增加根節點
        Element books = doc.addElement("bookstore");
        //增加子元素
        Element book1 = books.addElement("book");
        Element title1 = book1.addElement("title");
        Element author1 = book1.addElement("author");
          
        Element book2 = books.addElement("book");
        Element title2 = book2.addElement("title");
        Element author2 = book2.addElement("author");
          
        //為子節點添加屬性
        book1.addAttribute("id", "3");
        //為元素添加內容
        title1.setText("戰爭與和平");
        author1.setText("列夫托爾斯泰");
          
        book2.addAttribute("id", "4");
        title2.setText("紅樓夢");
        author2.setText("曹雪芹");
          
        //實例化輸出格式對象
        OutputFormat format = OutputFormat.createPrettyPrint();
        //設置輸出編碼
        format.setEncoding("UTF-8");
        //創建需要寫入的File對象
        File file = new File("test2.xml");
        //生成XMLWriter對象,構造函數中的參數為需要輸出的文件流和格式
        XMLWriter writer = new XMLWriter(new FileOutputStream(file), format);
        //開始寫入,write方法中包含上面創建的Document對象
        writer.write(doc);
    }
}

  運行結果(項目根目錄下):

<?xml version="1.0" encoding="UTF-8"?>

<bookstore>
  <book id="3">
    <title>戰爭與和平</title>
    <author>列夫托爾斯泰</author>
  </book>
  <book id="4">
    <title>紅樓夢</title>
    <author>曹雪芹</author>
  </book>
</bookstore>

3.2 DOM4J修改xml文件

public class XmlDeml {
    public static void main(String[] args) throws Exception {
        SAXReader reader = new SAXReader();
        File file = new File("test.xml");
        Document document = reader.read(file);
        Element root = document.getRootElement();
        Element nameElement = root.element("book").element("author");
        nameElement.setText("魯迅");
        //寫回XML文檔
        OutputFormat format = OutputFormat.createPrettyPrint();
        XMLWriter writer = new XMLWriter(new FileOutputStream("test.xml"), format);
        writer.write(document);
        writer.close();
    }
}

  運行結果(項目根目錄下):

<?xml version="1.0" encoding="UTF-8"?>

<bookstore> 
  <book id="1"> 
    <title>巴黎聖母院</title>  
    <author>魯迅</author> 
  </book> 
</bookstore>

您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 調用 // 分頁import pages from 'components/common/pages/pages' components: { pages }, <pages :total="total" :page-size="pageSize" @handleSizeChangeSub="han ...
  • 微服務是Devops場景下熱門的開發框架,在大型項目中被廣泛採用。它把一個大型的單個應用程式和服務拆分為數十個的支持微服務,獨立部署、互相隔離,通過擴展組件來處理功能瓶頸問題,比傳統的應用程式更能有效利用計算資源。微服務之間無需關心對方的模型,它通過事先約定好的介面進行數據流轉,使業務可以高效響應市 ...
  • 責任鏈模式是一種行為型模式,將一系列處理者鏈接在一起,形成一個處理整體,將具體的請求處理者與請求者進行分離,本文介紹了職責鏈模式的意圖,使用場景,以及結構,角色模塊,並且給出來了Java版本的責任鏈模式實現。 ...
  • 博主按:《每天一個設計模式》旨在初步領會設計模式的精髓,目前採用 (_靠這吃飯_)和 (_純粹喜歡_)兩種語言實現。誠然,每種設計模式都有多種實現方式,但此小冊只記錄最直截了當的實現方式 :) 0. 項目地址 "每天一個設計模式之訂閱 發佈模式·原文地址" "本節課代碼" "《每天一個設計模式·系列 ...
  • 裝飾模式(Decorator Pattern)是一種比較常見的模式。 定義: 動態地給一個對象添加一些額外的職責,就增加功能來說,裝飾模式比生成子類更為靈活。 裝飾模式類圖如下所示。 裝飾模式有以下4個角色。 抽象構件(Component)角色:用於規範需要裝飾的對象(原始對象)。 具體構件(Con ...
  • 我們首先來思考一個問題:作為工程師,我們的價值是什麼? 筆者認為是—— 解決用戶問題 。 我們的任何知識和技能,如果不能解決特定的問題,那麼就是無用的屠龍之術;我們的任何經驗,如果不能對解決新的問題有用,那這經驗就是過時的。工程師不是空談者,也不是理論家,再好的理論,再好的設計,不能落地變成產品,不 ...
  • 返回字元出現的第一個位置, 如果字元在被搜索字元串的開頭, 則會返回 ‘0’ 因此, 在使用此函數判斷 字元串是否包含 某一個字元時 使用: 1 ...
  • pom.xml(對Kaptcha.jar的引用) spring-mvc.xml(Kaptche的相關設置) BaseController.java(驗證碼獲取Controller) 前臺js(初始化驗證碼圖片) 當寫完前臺代碼,訪問login.jsp時驗證碼獲取失敗(Status Code:302 ...
一周排行
    -Advertisement-
    Play Games
  • 前言 本文介紹一款使用 C# 與 WPF 開發的音頻播放器,其界面簡潔大方,操作體驗流暢。該播放器支持多種音頻格式(如 MP4、WMA、OGG、FLAC 等),並具備標記、實時歌詞顯示等功能。 另外,還支持換膚及多語言(中英文)切換。核心音頻處理採用 FFmpeg 組件,獲得了廣泛認可,目前 Git ...
  • OAuth2.0授權驗證-gitee授權碼模式 本文主要介紹如何筆者自己是如何使用gitee提供的OAuth2.0協議完成授權驗證並登錄到自己的系統,完整模式如圖 1、創建應用 打開gitee個人中心->第三方應用->創建應用 創建應用後在我的應用界面,查看已創建應用的Client ID和Clien ...
  • 解決了這個問題:《winForm下,fastReport.net 從.net framework 升級到.net5遇到的錯誤“Operation is not supported on this platform.”》 本文內容轉載自:https://www.fcnsoft.com/Home/Sho ...
  • 國內文章 WPF 從裸 Win 32 的 WM_Pointer 消息獲取觸摸點繪製筆跡 https://www.cnblogs.com/lindexi/p/18390983 本文將告訴大家如何在 WPF 裡面,接收裸 Win 32 的 WM_Pointer 消息,從消息裡面獲取觸摸點信息,使用觸摸點 ...
  • 前言 給大家推薦一個專為新零售快消行業打造了一套高效的進銷存管理系統。 系統不僅具備強大的庫存管理功能,還集成了高性能的輕量級 POS 解決方案,確保頁面載入速度極快,提供良好的用戶體驗。 項目介紹 Dorisoy.POS 是一款基於 .NET 7 和 Angular 4 開發的新零售快消進銷存管理 ...
  • ABP CLI常用的代碼分享 一、確保環境配置正確 安裝.NET CLI: ABP CLI是基於.NET Core或.NET 5/6/7等更高版本構建的,因此首先需要在你的開發環境中安裝.NET CLI。這可以通過訪問Microsoft官網下載並安裝相應版本的.NET SDK來實現。 安裝ABP ...
  • 問題 問題是這樣的:第三方的webapi,需要先調用登陸介面獲取Cookie,訪問其它介面時攜帶Cookie信息。 但使用HttpClient類調用登陸介面,返回的Headers中沒有找到Cookie信息。 分析 首先,使用Postman測試該登陸介面,正常返回Cookie信息,說明是HttpCli ...
  • 國內文章 關於.NET在中國為什麼工資低的分析 https://www.cnblogs.com/thinkingmore/p/18406244 .NET在中國開發者的薪資偏低,主要因市場需求、技術棧選擇和企業文化等因素所致。歷史上,.NET曾因微軟的閉源策略發展受限,儘管後來推出了跨平臺的.NET ...
  • 在WPF開發應用中,動畫不僅可以引起用戶的註意與興趣,而且還使軟體更加便於使用。前面幾篇文章講解了畫筆(Brush),形狀(Shape),幾何圖形(Geometry),變換(Transform)等相關內容,今天繼續講解動畫相關內容和知識點,僅供學習分享使用,如有不足之處,還請指正。 ...
  • 什麼是委托? 委托可以說是把一個方法代入另一個方法執行,相當於指向函數的指針;事件就相當於保存委托的數組; 1.實例化委托的方式: 方式1:通過new創建實例: public delegate void ShowDelegate(); 或者 public delegate string ShowDe ...