1. 程式人生 > >XML(可擴充套件標籤語言)

XML(可擴充套件標籤語言)

XML

一、Extend Markup Languge(可擴充套件標籤語言)

標籤由開發者自己制定的(要按照一定的語法定義)

1)描述帶關係的資料(作為軟體的配置檔案): 包含與被包含的關係

    <user>
        <name>eric</name>
        <password>123456</password>
    </user>

應用場景: tomcat struts Hibernate spring (三大框架)

2)作為資料的載體(儲存資料,小型的“資料庫”)

二、XML語法

xml檔案以xml字尾名結尾。

xml檔案需要使用xml解析器去解析。瀏覽器內建了xml解析器。

標籤

語法: <student></student>  開始標籤  標籤體內容  結束標籤
                1)<student/> 或 <student></student> 空標籤。沒有標籤體內容
                2)xml標籤名稱區分大小寫。
                3)xml標籤一定要正確配對。
                4)xml標籤名中間不能使用空格
                5)xml標籤名不能以數字開頭
                6)注意: 在一個xml文件中,有且僅有一個根標籤

屬性

語法: <Student name="eric">student</Student>
            注意:
                    1)屬性值必須以引號包含,不能省略,也不能單雙引號混用!!!
                    2)一個標籤內可以有多個屬性,但不能出現重複的屬性名!!!

註釋

語言: <!--  xml註釋 -->

需求:通訊錄系統

聯絡人資料:編號 (唯一的) 姓名   年齡   電話 郵箱  QQ 

                 要求: 
                contact.xml
                    1)設計一個xml檔案,用於儲存聯絡人資料
                    2)這個xml檔案可以多個聯絡人。

文件宣告

語法: <?xml version="1.0" encoding="utf-8"?>

        version: xml的版本號
        encoding: 解析xml檔案時查詢的碼錶(解碼過程時查詢的碼錶)
注意:
                1)如果在ecplise工具中開發xml檔案,儲存xml檔案時自動按照文件宣告的encoding來儲存文                    件。
                2)如果用記事本工具修改xml檔案,注意儲存xml檔案按照文件宣告的encoding的碼錶來儲存。

* XML檔案

    <?xml version="1.0" encoding="utf-8"?>
    <contactList>
        <contact id="001">
            <name>張三</name>
            <age>20</age>
            <phone>134222223333</phone>
            <email>[email protected]</email>
            <qq>432221111</qq>
        </contact>
        <contact id="002">
            <name>李四</name>
            <age>20</age>
            <phone>134222225555</phone>
            <email>[email protected]</email>
            <qq>432222222</qq>
        </contact>
    </contactList>

XML解析

XML檔案除了給開發者看,更多的情況使用程式讀取xml檔案的內容。這叫做xml解析

XML解析方式(原理不同)

DOM解析

SAX解析

XML解析工具

DOM解析原理:
            1)JAXP (oracle-Sun公司官方)
            2)JDOM工具(非官方)
            3)Dom4J工具(非官方)
            三大框架(預設讀取xml的工具就是Dom4j)
            .......

SAX解析原理:
            1)Sax解析工具(oracle-sun公司官方)

什麼是DOM解析

DOM解析原理:xml解析器一次性把整個xml文件載入進記憶體,
然後在記憶體中構建一顆Document的物件樹,通過Document物件,
得到樹上的節點物件,通過節點物件訪問(操作)到xml文件的內容。

Dom4j工具

非官方,不在jdk中。
        使用步驟:
            1)匯入dom4j的核心包。 dom4j-1.6.1.jar
            2)編寫Dom4j讀取xml檔案程式碼

* 示例

    /**
     * 第一個Dom4j讀取xml文件的例子
     * @author APPle
     *
     */
    public class Demo1 {
        public static void main(String[] args) {
            try {
                //1.建立一個xml解析器物件
                SAXReader reader = new SAXReader();
                //2.讀取xml文件,返回Document物件
                Document doc = reader.read(new File("./src/contact.xml"));

                System.out.println(doc);
            } catch (DocumentException e) {
                e.printStackTrace();
                throw new RuntimeException(e);
            }
        }
    }

Domj4讀取xml檔案

  • 節點:
  • Iterator  Element.nodeIterator();  //獲取當前標籤節點下的所有子節點
    
    • 案列:

      /**
       * 得到節點資訊
       */
      @Test
      public void test1() throws Exception{
          //1.讀取xml文件,返回Document物件
          SAXReader reader = new SAXReader();
          Document doc = reader.read(new File("./src/contact.xml"));
          //2.nodeIterator: 得到當前節點下的所有子節點物件(不包含孫以下的節點)
          Iterator<Node> it = doc.nodeIterator();
          while(it.hasNext()){//判斷是否有下一個元素
              Node node = it.next();//取出元素
              //繼續取出其下面的子節點
              //只有標籤節點才有子節點
              //判斷當前節點是否是標籤節點
              if(node instanceof Element){
                  Element elem = (Element)node;
                  Iterator<Node> it2 = elem.nodeIterator();
                  while(it2.hasNext()){
                      Node n2 = it2.next();
                      System.out.println(n2.getName());
                  }
              }
          }
      }
      
    • 案例2:得到xml所有節點(使用遞迴)

      /**
       * 遍歷xml文件的所有節點
       * @throws Exception
       */
      @Test
      public void test2() throws Exception{
          //1.讀取xml文件,返回Document物件
          SAXReader reader = new SAXReader();
          Document doc = reader.read(new File("./src/contact.xml"));
          //得到根標籤
          Element rooElem = doc.getRootElement();
          getChildNodes(rooElem);
      }
      
      /**
       * 獲取 傳入的標籤下的所有子節點
       * @param elem
       */
      private void getChildNodes(Element elem){
          System.out.println(elem.getName());
          //得到子節點
          Iterator<Node> it = elem.nodeIterator();
          while(it.hasNext()){
              Node node = it.next();
              //1.判斷是否是標籤節點
              if(node instanceof Element){
                  Element el = (Element)node;
                  //遞迴
                  getChildNodes(el);
              }
          };
      }
      
  • 標籤:

  •  Element  Document.getRootElement();  //獲取xml文件的根標籤     
     Element   ELement.element("標籤名") //指定名稱的第一個子標籤
     Iterator<Element> Element.elementIterator("標籤名");// 指定名稱的所有子標籤
     List<Element>   Element.elements(); //獲取所有子標籤
    
    • 案例:

      /**
       * 獲取標籤
       */
      @Test
      public void test3() throws Exception{
          //1.讀取xml文件,返回Document物件
          SAXReader reader = new SAXReader();
          Document doc = reader.read(new File("./src/contact.xml"));
      
          //2.得到根標籤
          Element  rootElem = doc.getRootElement();
          //得到標籤名稱
          String name = rootElem.getName();
          System.out.println(name);
      
          //3.得到當前標籤下指定名稱的第一個子標籤
          Element contactElem = rootElem.element("contact");
          System.out.println(contactElem.getName());
      
          //4.得到當前標籤下指定名稱的所有子標籤
          Iterator<Element> it = rootElem.elementIterator("contact");
          while(it.hasNext()){
              Element elem = it.next();
              System.out.println(elem.getName());
          }
      
          //5.得到當前標籤下的的所有子標籤
                  List<Element> list = rootElem.elements();
                  //遍歷List的方法
                  //1)傳統for迴圈  2)增強for迴圈 3)迭代器
                  for(int i=0;i<list.size();i++){
                      Element e = list.get(i);
                      System.out.println(e.getName());
                  }
      
                  //獲取更深層次的標籤(方法只能一層層地獲取)
                  Element nameElem = doc.getRootElement().
                              element("contact").element("name");
                  System.out.println(nameElem.getName());
      
              }                       
      
  • 屬性:
  •  String   Element.attributeValue("屬性名") //獲取指定名稱的屬性值
     Attribute    Element.attribute("屬性名");//獲取指定名稱的屬性物件    
     Attribute.getName()  //獲取屬性名稱
     Attibute.getValue()  //獲取屬性值
     List<Attribute>     Element.attributes();  //獲取所有屬性物件
     Iterator<Attribute>        Element.attibuteIterator(); //獲取所有屬性物件
    
    • 案列:

      /**
       * 獲取屬性
       */
      @Test
      public void test4() throws Exception{
          //1.讀取xml文件,返回Document物件
          SAXReader reader = new SAXReader();
          Document doc = reader.read(new File("./src/contact.xml"));
          //獲取屬性:(先獲的屬性所在的標籤物件,然後才能獲取屬性)
          //1.得到標籤物件
          Element contactElem = doc.getRootElement().element("contact");
          //2.得到屬性
          //2.1  得到指定名稱的屬性值
          String idValue = contactElem.attributeValue("id");
          System.out.println(idValue);
          //2.2 得到指定屬性名稱的屬性物件
          Attribute idAttr = contactElem.attribute("id");
          //getName: 屬性名稱    getValue:屬性值
          System.out.println(idAttr.getName() +"=" + idAttr.getValue());
      
          //2.3 得到所有屬性物件,返回LIst集合
          List<Attribute> list = contactElem.attributes();
          //遍歷屬性
          for (Attribute attr : list) {
              System.out.println(attr.getName()+"="+attr.getValue());
          }
      }
      
  • 文字:

    • 案例:

      /**
       * 獲取文字
       */
      @Test
      public void test5() throws Exception{
          //1.讀取xml文件,返回Document物件
          SAXReader reader = new SAXReader();
          Document doc = reader.read(new File("./src/contact.xml"));
          /**
           * 注意: 空格和換行也是xml的內容
           */
          String content = doc.getRootElement().getText();
          System.out.println(content);
          //獲取文字(先獲取標籤,再獲取標籤上的文字)
          Element nameELem = doc.getRootElement().element("contact").element("name");
          //1. 得到文字
          String text = nameELem.getText();
          System.out.println(text);
          //2. 得到指定子標籤名的文字內容
          String text2 = 
          doc.getRootElement().element("contact").elementText("phone");
          System.out.println(text2);
      }
      

  • Element.getText(); //獲取當前標籤的文字
    Element.elementText(“標籤名”) //獲取當前標籤的指定名稱的子標籤的文字內容

練習-完整讀取xml文件內容

public class Demo3 {
    @Test
    public void test() throws Exception{
        //讀取xml文件
        SAXReader reader = new SAXReader();
        Document doc = 
                reader.read(new File("./src/contact.xml"));

        //讀取根標籤
        Element rootELem = doc.getRootElement();

        StringBuffer sb = new StringBuffer();

        getChildNodes(rootELem,sb);

        System.out.println(sb.toString());

    }

    /**
     * 獲取當前標籤的所有子標籤
     */
    private void getChildNodes(Element elem,StringBuffer sb){
        //System.out.println(elem.getName());

        //開始標籤
        sb.append("<"+elem.getName());

        //得到標籤的屬性列表
        List<Attribute> attrs = elem.attributes();
        if(attrs!=null){
            for (Attribute attr : attrs) {
                //System.out.println(attr.getName()+"="+attr.getValue());
                sb.append(" "+attr.getName()+"=\""+attr.getValue()+"\"");
            }
        }
        sb.append(">");

        //得到文字
        //String content = elem.getText();
        //System.out.println(content);
        Iterator<Node> it = elem.nodeIterator();
        while(it.hasNext()){
            Node node = it.next();

            //標籤
            if(node instanceof Element){
                Element el = (Element)node;
                getChildNodes(el,sb);
            }

            //文字
            if(node instanceof Text){
                Text text = (Text)node;
                sb.append(text.getText());
            }
        }

        //結束標籤
        sb.append("</"+elem.getName()+">");
    }
}

把xml文件資訊封裝到物件中

/**
 * 把xml文件資訊封裝到物件中
 * @author APPle
 *
 */
public class Demo4 {

        public static void main(String[] args) throws Exception{
            List<Contact> list = new ArrayList<Contact>();          
            //讀取xml,封裝物件
            SAXReader reader = new SAXReader();
            Document doc = reader.read(new File("./src/contact.xml"));
            //讀取contact標籤
            Iterator<Element> it = doc.getRootElement().elementIterator("contact");
            while(it.hasNext()){
                Element elem = it.next();
                //建立Contact
                Contact contact = new Contact();
                contact.setId(elem.attributeValue("id"));
                contact.setName(elem.elementText("name"));
                contact.setAge(elem.elementText("age"));
                contact.setPhone(elem.elementText("phone"));
                contact.setEmail(elem.elementText("email"));
                contact.setQq(elem.elementText("qq"));
                list.add(contact);
            }

            for (Contact contact : list) {
                System.out.println(contact);
            }
        }
}

相關推薦

XML(擴充套件標籤語言

XML 一、Extend Markup Languge(可擴充套件標籤語言) 標籤由開發者自己制定的(要按照一定的語法定義) 1)描述帶關係的資料(作為軟體的配置檔案): 包含與被包含的關係 <user>

xml(擴充套件標記語言dtd(xml約束,文件型別定義schema(功能比dtd更強大,用以定義xml檔案。字尾名為xsd檔案

xml:要理解什麼是xml檔案,和html(超文字標記語言)做比較,就很清晰了。      html:是一種可在瀏覽器中顯示的檔案,主要功能是將裡面的文字內容靜態的展示出來,用於顯示資料。                  html使用的標籤html語言規定好的,每個

第二十三章:XML擴充套件標記語言

作者:java_wxid XML 簡介 什麼是 XML? XML 指可擴充套件標記語言(EXtensible Markup Language)。 XML 是一種很像HTML的標記語言。 XML 的設計宗旨是傳輸資料,而不是顯示資料。 XML 標籤沒有被預定義。您需要自行定義標籤。

XML(擴充套件標記語言)

20181024學習筆記 XML全稱:extended Markup Language可擴充套件的含義:允許程式設計師按照自己的想法擴充套件新的標籤,但是擴充套件的時候,必須要遵循XML規範(1-1) XML的特點: 自帶描述性; 可以支援跨平臺; 保留了面向物

擴充套件標記語言XML

目錄   什麼是xml  XML檔案的常見應用: 一個XML檔案包含如下類容: 文件宣告: 元素 屬性 註釋 CDATA區域 處理指令 XML約束 DTD入門: 什麼是xml  XML:Extensible M

XML拓展標記語言

tle odin 對齊 cda 必須 style 結構 有一個 name 一、XML文檔基本結構 1.XML聲明(一般位於文檔的第一句話) <?xml version="1.0" encoding="utf-8"?> 2.每個XML文檔都有且僅有一個根元

擴充套件標記語言

1.xml XML: 一種標記語言 , 類似於HTML ,            標籤都是自定義的.               1.0版本. 2.xml 與 html 的主要差異 xml標籤都是自定義的,html標籤是預定義。 xml的語法嚴格,ht

一種高效的android雙擊退出(擴充套件多擊

參考Google,安卓手機中在檢視安卓系統版本的地方,三擊或者多擊會出現彩蛋,可以借鑑其原始碼進行實現。 //利用陣列來儲存時間     long[] mHits = new long[3];     @Override     pub

擴展標記語言XML(淅淅瀝瀝的小雨

ogr 部分 cti AD 標簽 引入 throws jdom 官方 XML簡述   XML用於描述數據,是當前處理結構化文檔信息的有力工具。與操作系統編程語言的開發平臺無關,可以實現不同系統之間的數據交互。   xml文件結構: 1 <?xml version="

如何設計一門語言(十二——設計擴充套件的型別

在思考怎麼寫這一篇文章的時候,我又想到了以前討論正交概念的事情。如果一個系統被設計成正交的,他的功能擴充套件起來也可以很容易的保持質量這是沒錯的,但是對於每一個單獨給他擴充套件功能的個體來說,這個系統一點都不好用。所以我覺得現在的語言被設計成這樣也是有那麼點道理的。就算是設計Java的那誰,他也不是傻逼,那為

HR-XML擴充套件人力資源標準簡介

HR-XML(可擴充套件人力資源標準)簡介 Flyspace ([email protected])<?xml:namespace prefix = st1 ns = "urn:schemas-microsoft-com:office:smarttags" /

程序員之---C語言細節12(指針和數組細節,&quot;//&quot;的移植性說明

[1] watermark popu i++ gravity 移植 char dsm 指針 主要內容:指針和數組細節,"//"的可移植性說明 #include <stdio.h> int main(int argc, char

XML擴展標記語言

xml dom4j解析 sax解析 xmlpull解析 一、XML可擴展標記語言 1、概念: XML推出初衷是為了替換HTML,標簽名可以直接定義,不能用數字開頭 不能使用純數字 區分大小寫,後用做配置文件 封裝數據 因為xml具有良好的格式,所以用途非常廣泛,比如持久化存儲數據 數據交換

Android 開發:(十初識ExpandableListView(擴充套件的下拉列表元件)

隨便扯點兒 前幾天做iOS仿QQ,其中好友列表頁面就有下拉列表的功能,iOS做法應該比安卓稍微複雜一點,其中佈局以及一些實現方法(協議方法)都類似,不一樣的應該是動畫切換效果,安卓提供現成的元件,用原生的就可以實現。 iOS示例 http://blog.

實用的選項(Optional擴充套件

作者:terhechte,原文連結,原文日期:2018-01-10 譯者:rsenjoyer;校對:numbbbbb,Yousanflics;定稿:Forelax 可選值(Optional)是 Swift 語言最基礎的內容。我想每個人都同意它帶來了巨大的福音,因為它迫使開發者妥善處理邊緣情況。可選

FINN(一簡介一種快速,擴充套件的二值化神經網路框架

摘要: 研究表明,卷積神經網路具有明顯的冗餘,即使權重和啟用從浮點減少到二進位制值,也可以獲得高分類精度。在本文中,我們介紹了FINN,一個使用靈活的異構流體系結構構建快速和靈活的FPGA加速器的框架。通過利用一組新的優化功能,可以實現二值化神經網路到硬體的高效

《Spring 5 官方文件》39. 建立擴充套件XML

39.7.2 Custom attributes on ‘normal’ elements 編寫自己的自定義解析器和相關的工件不是很難,但有時候會出一些錯誤。 考慮您需要向現有的bean定義新增元資料的場景。 在這種情況下,您絕對不需要自己去完成自己的整個定製擴充套件; 而您只需要為現有的bea

億級流量系統架構之如何在上萬併發場景下設計擴充套件架構(上?【石杉的架構筆記】

歡迎關注個人公眾號:石杉的架構筆記(ID:shishan100) 週一至週五早8點半!精品技術文章準時送上! 一、寫在前面 之前更新過一個“億級流量系統架構”系列,主要講述了一個大規模商家資料平臺的如下幾個方面: 如何承載百億級資料儲存 如何設計高容錯的分散式架構 如何設計承載百億流量的高效能架構

億級流量系統架構之如何在上萬併發場景下設計擴充套件架構(中?【石杉的架構筆記】

歡迎關注個人公眾號:石杉的架構筆記(ID:shishan100) 週一至週五早8點半!精品技術文章準時送上! 目錄 一、前情提示 二、清晰劃分系統邊界 三、引入訊息中介軟體解耦 四、利用訊息中介軟體削峰填谷 五、手動流量開關配合資料庫運維 六、支援多系統同時訂閱資料 七、系統解耦後的感受 八、下集預告

億級流量系統架構之如何在上萬併發場景下設計擴充套件架構(下?【石杉的架構筆記】

歡迎關注個人公眾號:石杉的架構筆記(ID:shishan100) 週一至週五早8點半!精品技術文章準時送上! 一、前情提示 上一篇文章億級流量系統架構之如何在上萬併發場景下設計可擴充套件架構(中)?分析了一下如何利用訊息中介軟體對系統進行解耦處理。 同時,我們也提到了使用訊息中介軟體還有利