XML的概述,.Dom4解析和SAX解析

1.什麼是XMLhtml

  • XML 指可擴展標記語言(EXtensible Markup Language) html(hyper text markup langauge)java

  • XML 是一種標記語言,很相似 HTMLweb

  • XML 的設計宗旨是傳輸數據,而非顯示數據(webservice)spring

  • XML 標籤沒有被預約義。您須要自行定義標籤數據庫

  • XML 被設計爲具備自我描述性數組

  • XML 是 W3C 的推薦標準app

  • XML能夠存儲數據(小型數據庫)框架

  • XML能夠做爲框架的配置問 web.xml applicationContext.xml(spring的配置文件) ,hibernate.cfg.xmldom

2.XML與HTML的主要區別
性能

  • XML 不是 HTML 的替代。
  • XML 和 HTML 爲不一樣的目的而設計:
  • XML 被設計爲傳輸和存儲數據,其焦點是數據的內容。
  • HTML 被設計用來顯示數據,其焦點是數據的外觀。
  • HTML 旨在顯示信息,而 XML 旨在傳輸信息。

3.XML語法

  • XML 標籤對大小寫敏感
  • XML 元素都須有關閉標籤<student> </student>
  • XML 文檔必須有根元素
  • XML 的屬性值須加引號

4.XML命名規則

XML 元素必須遵循如下命名規則:

  • 名稱能夠含字母、數字以及其餘的字符

  • 名稱不能以數字或者標點符號開始

  • 名稱不能以字符 「xml」(或者 XML、Xml)開始

  • 名稱不能包含空格

可以使用任何名稱,沒有保留的字詞。

 5.特殊字符

< "<" 小於
> > 大於
& & 和號
' ' 單引號
" " 引號

2.XML解析

 文檔:

根據xml文件建立對應的類

3.Dom4解析

3.1什麼是Dom4j

dom4j是一個Java的XML API,是jdom的升級品,用來讀寫XML文件的。dom4j是一個十分優秀的javaXML API,具備性能優異、功能強大和極其易使用的特色,它的性能超過sun公司官方的dom技術,同時它也是一個開放源代碼的軟件,能夠在SourceForge上找到它。在IBM developerWorks上面還能夠找到一篇文章,對主流的Java XML API進行的性能、功能和易用性的評測,因此能夠知道dom4j不管在哪一個方面都是很是出色的。現在能夠看到愈來愈多的Java軟件都在使用dom4j來讀寫XML,特別值得一提的是連Sun的JAXM也在用dom4j。這已是必須使用的jar包, Hibernate也用它來讀寫配置文件。

 

3.2 核心類

SAXReader Demo4讀取文件的類

經常使用方法:

​ read 讀取指定的xml文件

Document 文檔類 用於加載指定的文檔

經常使用方法:

​ getRootElement 獲取根節點

Element 標籤類,元素

​ 經常使用方法:

​ elements 獲取全部的直接子標籤

​ attribute 獲取指定屬性名稱的屬性對象

​ elementText 獲取指定子標籤名稱的文本內容

​ element 獲取指定標籤名稱的標籤對象

​ getText(); 獲得當前標籤中間的文本

3.3 實現xml解析

4.SAX解析

4.1 什麼是SAX

SAX,全稱Simple API for XML,既是一種接口,也是一種軟件包。它是一種XML解析的代替方法。SAX不一樣於DOM解析,它逐行掃描文檔,一邊掃描一邊解析。因爲應用程序只是在讀取數據時檢查數據,所以不須要將數據存儲在內存中,這對於大型文檔的解析是個巨大優點

dom:把XML文件讀取到內容,構建樹形結構

4.2 SAX優缺點

  • SAX的優勢:

    1. 解析速度快

    2. 佔用內存少

  • SAX的缺點:

    1. 沒法知道當前解析標籤(節點)的上層標籤,及其嵌套結構,僅僅知道當前解析的標籤的名字和屬性,要知道其餘信息須要程序猿本身編碼

    2. 只能讀取XML,沒法修改XML

    3. 沒法隨機訪問某個標籤(節點)

  • SAX解析適用場合 

    SAX解析適用場合 對於CPU資源寶貴的設備,如Android等移動設備對於只需從xml讀取信息而無需修改xml

4.3 代碼實現

建立自定義處理數據的模板類

繼承DefaultHandler類

從新四個方法

startDocument();解析到xml文件的開始

startElement();解析到標籤的開頭 <book>

endElement(); 解析到標籤結尾</book>

character(); 解析到標籤中間的文本

 代碼:

public classMyBookHandler extends DefaultHandler

{/* 聲明解析後存儲對象的集合*/

private Book book;

private List<Book>books;

private String tagName;//當前解析的標籤

public list<Book> getBooks(){

return books;

}

public void startDocument() throws SAXException{

System.out.println("文檔的開始");

}

public void endDocument()throws SAXException{

System.out.println("文檔的結束");

}

/*解析到標籤的開頭String qName 解析到的標籤的名稱<book id="1001">

Attributes attributes  當前這個標籤中的屬性 id="1001"   */

public void startElement (String uri,String localName,String qName,Attributes attributes) throws SAXException{

if("books".equals(qName)){

books=new ArrayList<>();

}else if("book".equals(qName)){

book=new Book();

String ids=attributes.getValue("id");

String date=attributes.getValue("publishdate");

book.setId(Integer.parseInt(ids));

book.setPublishdate(date);

}

tagName=qName;

}

/*解析到標籤的結尾

@param  uri

@param   localName

@param   qName

@throws   SAXEXception  */

public void endElement(String uri,String locatiion,String qName)throws SAXException{

//Sysem.out.println(「標籤的結尾」+qName);

tagName=" ";

if("book"equals (qName))

{

book.add(book);

}

/*** 解析到文本
     * @param ch
     * @param start
     * @param length
     * @throws SAXException  */

public void characters(char[] ch, int start, int length) throws SAXException {
        // 把char類型的數組--->string
        String content = new  String(ch,start,length);
        //System.out.println(content);//有可能獲得換行符或者空格
        content = content.trim();
        //System.out.println("處理後:"+content+"---標籤"+tagName);
        //book.setName(content);
        if ("name".equals(tagName)) {//""
            book.setName(content);
        }else if("author".equals(tagName)) {
            book.setAuthor(content);
        }else if("price".equals(tagName)) {
            //book.setPrice(Double.parseDouble(content));
        }

}

 

使用SAX進行解析

僞代碼:

具體代碼:

 

擴展:DOM解析

dom解析:xml文件加載到內存中,在內存中構建樹形結構,文件比較大,不建議使用DOM解析

核心API:

DocumentBuilderFactory

DocumentBuilder

Document xml文檔

Node xml文件中的一個節點(標籤節點,屬性節點,空格或者註釋等也是Node對象)

​ getNodeName(); 標籤名稱

​ getNodeValue(); 屬性值

​ getAttributes() ; 獲得屬性列表

​ getTextContent();標籤中的文本

NodeList: 子節點列表

Attribute 屬性對象

 

相關文章
相關標籤/搜索