亚洲中字慕日产2020,大陆极品少妇内射AAAAAA,无码av大香线蕉伊人久久,久久精品国产亚洲av麻豆网站

資訊專欄INFORMATION COLUMN

XML解析

Cheng_Gang / 2147人閱讀

摘要:我們解析的最終目的當然就是獲得數(shù)據(jù)的值。所以,方式的優(yōu)缺點是特點優(yōu)點整個文檔樹存在內(nèi)存中,可對文檔進行操作刪除修改等等可多次訪問已解析的文檔由于在內(nèi)存中以樹形結(jié)構(gòu)存放,因此檢索和更新效率會更高。

目錄

定義

XML(extensible Markup Language) ,是一種數(shù)據(jù)標記語言 & 傳輸格式

作用

對數(shù)據(jù)進行標記(結(jié)構(gòu)化數(shù)據(jù))

對數(shù)據(jù)進行存儲

對數(shù)據(jù)進行傳輸

與html的區(qū)別:html用于顯示信息;xml用于存儲&傳輸信息

XML特點

標簽可進行自定義

XML允許作者定義自己的標簽和文檔結(jié)構(gòu)

自我描述性

> **XML文檔實例**
> 
> ```
> 
>   
>  
> 
> George
> John
> Reminder
> Dont"t forget the meeting!
> 
> 
> 
> ```
> 
> 僅僅是一個純文本,有文本處理能力的軟件都可以處理xml

可拓展性

在不中斷解析、應用程序的情況下進行拓展。

可跨平臺數(shù)據(jù)傳輸

可在不兼容的系統(tǒng)之間進行交換數(shù)據(jù),降低了復雜性

數(shù)據(jù)共享方便

XML以純文本進行存儲,獨立于軟件、硬件和應用程序的數(shù)據(jù)存儲方式,使得不同應用程序、軟件和硬件都能訪問xml的數(shù)據(jù)

語法

元素要關(guān)閉標簽

`< p >this is a bitch 

`

對大小寫敏感

< P >這是錯誤的

< p >這是正確的

必須要有根元素(父元素)


 
 

屬性值必須加引號


實體引用

實體引用 符號 含義
<; < 小于
> ; > 大于
&; & 和浩
&apos; 單引號
"; " 雙引號

元素不能使用&(實體的開始)和<(新元素的開始)

注釋

``

XML的元素、屬性和屬性值

> 文檔實例
> 
> ```
> 
> 
>     Harry Potter 
>     JK.Rowling
> 
> 
>     woshiPM 
>    Carson_Ho
> 
> 
> ```
> 
> 其中,是根元素;是子元素,也是元素類型之一;而中含有屬性,即category,屬性值是CHILDREN;而元素則擁有文本內(nèi)容( JK.Rowling)

元素與屬性的差別

屬性即提供元素額外的信息,但不屬于數(shù)據(jù)組成部分的信息。

> 范例一
> 
> ```
> 
> 
>     Harry Potter 
>     JK.Rowling
> 
> ```
> 
> 范例二
> 
> ```
> 
> 
>    CHILDREN
>     Harry Potter 
>     JK.Rowling
> 
> ```
> 
> 范例一和二提供的信息是完全相同的。

一般情況下,請使用元素,因為

屬性無法描述樹結(jié)構(gòu)(元素可以)

屬性不容易拓展(元素可以)

使用屬性的情況:用于分配ID索引,用于標識XML元素。

實例


  
     CHILDREN
      Harry Potter 
      JK.Rowling
  
  
     CHILDREN
      Harry Potter 
      JK.Rowling
  

上述屬性(id)僅用于標識不同的便簽,并不是數(shù)據(jù)的組成部分

XML元素命名規(guī)則

不能以數(shù)字或標點符號開頭

不能包含空格

不能以xml開頭

CDATA
不被解析器解析的文本數(shù)據(jù),所有xml文檔都會被解析器解析(cdata區(qū)段除外)

PCDATA
被解析的字符數(shù)據(jù)

XML樹結(jié)構(gòu)

XML文檔中的元素會形成一種樹結(jié)構(gòu),從根部開始,然后拓展到每個樹葉(節(jié)點),下面將以實例說明XML的樹結(jié)構(gòu)。

假設(shè)一個XML文件如下

<?xml version ="1.0" encoding="UTF-8"?>
<簡歷>
   <基本資料>
   <求職意向>
   <自我評價>
   <其他信息>
   <聯(lián)系方式>
   <我的作品>

其樹結(jié)構(gòu)如下

XML節(jié)點解釋

XML文件是由節(jié)點構(gòu)成的。它的第一個節(jié)點為“根節(jié)點”。一個XML文件必須有且只能有一個根節(jié)點,其他節(jié)點都必須是它的子節(jié)點。

this 代表整個XML文件,它的根節(jié)點就是 this.firstChild 。 this.firstChild.childNodes 則返回由根節(jié)點的所有子節(jié)點組成的節(jié)點數(shù)組。

  每個子節(jié)點又可以有自己的子節(jié)點。節(jié)點編號由0開始,根節(jié)點的第一個子節(jié)點為 this.firstChild.childNodes[0],它的子節(jié)點數(shù)組就是this.firstChild.childNodes[0].childNodes 。

根節(jié)點第一個子節(jié)點的第二個子節(jié)點 this.firstChild.childNodes[0].childNodes[1],它返回的是一個XML對象(Object) 。這里需要特別注意,節(jié)點標簽之間的數(shù)據(jù)本身也視為一個節(jié)點 this.firstChild.childNodes[0].childNodes[1].firstChild ,而不是一個值。

我們解析XML的最終目的當然就是獲得數(shù)據(jù)的值:

this.firstChild.childNodes[0].childNodes[1].firstChild.nodeValue 。

請注意區(qū)分:節(jié)點名稱(<性別>)和之間的文本內(nèi)容(男)可以當作是節(jié)點,也可以當作是一個值

節(jié)點:
名稱:this.firstChild.childNodes[0].childNodes[1]
文本內(nèi)容:this.firstChild.childNodes[0].childNodes[1].firstChild

值:
名稱:this.firstChild.childNodes[0].childNodes[1].nodeValue
(節(jié)點名稱有時也是我們需要的數(shù)據(jù))
文本內(nèi)容:this.firstChild.childNodes[0].childNodes[1].nodeName

在了解完XML之后,是時候來學下如何進行XML的解析了

XML解析

解析XML,即從XML中提取有用的信息

解析方式

基于文檔驅(qū)動方式

主流方式:DOM方式

簡介:XML DOM(XML Document Object Model),XML文件對象模型,定義了訪問操作xml文檔元素的方法和接口

工作原理: DOM是基于樹形結(jié)構(gòu)的的節(jié)點的文檔驅(qū)動方法。使用DOM對XML文件進行操作時,首先解析器讀入整個XML文檔到內(nèi)存中,然后解析全部文件,并將文件分為獨立的元素、屬性等,以樹結(jié)構(gòu)的形式在內(nèi)存中對XML文件進行表示,開發(fā)人員通過使用DOM API遍歷XML樹,根據(jù)需要修改文檔或檢索所需數(shù)據(jù)

DOM解析

假設(shè)需要解析的XML文檔如下(subject.xml)

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


  Java
  Android


  Swift#
  iOS


  Html5
 Web

核心代碼

public static List getSubjectList(InputStream stream)
 { tv = (TextView)findViewById(R.id.tv);
      try {
          //打開xml文件到輸入流
          InputStream stream = getAssets().open("subject.xml");
          //得到 DocumentBuilderFactory 對象
          DocumentBuilderFactory builderFactory = DocumentBuilderFactory.newInstance();
          //得到DocumentBuilder對象
          DocumentBuilder builder = builderFactory.newDocumentBuilder();
          //建立Document存放整個xml的Document對象數(shù)據(jù)
          Document document = builder.parse(stream);
          //得到 XML數(shù)據(jù)的"根節(jié)點" 
          Element element = document.getDocumentElement();
          //獲取根節(jié)點的所有l(wèi)anguage的節(jié)點
          NodeList list = element.getElementsByTagName("language");
           //遍歷所有節(jié)點
          for (int i= 0;i<=list.getLength();i++){
          //獲取lan的所有子元素
              Element language = (Element) list.item(i);
          //獲取language的屬性(這里即為id)并顯示
              tv.append(lan.getAttribute("id")+"
");
        //獲取language的子元素 name 并顯示                       tv.append(sub.getElementsByTagName("name").item(0).getTextContent()+"
");
       //獲取language的子元素usage 并顯示                    tv.append(sub.getElementsByTagName("usage").item(0).getTextContent()+"
");
          }

總結(jié)Dom解析的步驟

1、調(diào)用 DocumentBuilderFactory.newInstance() 方法得到 DOM 解析器工廠類實例。
2、調(diào)用解析器工廠實例類的 newDocumentBuilder() 方法得到 DOM 解析器對象
3、調(diào)用 DOM 解析器對象的 parse() 方法解析 XML 文檔得到代表整個文檔的 Document 對象。

基于事件驅(qū)動

主流方式:SAX、PULL方式

解析方式:可直接根據(jù)需要讀取所需的JSON數(shù)據(jù),不需要像DOM方法把文檔先入到內(nèi)存中

PULL解析

工作原理:PULL的解析方式與SAX解析類似,都是基于事件的模式。
PULL提供了開始元素和結(jié)束元素。當某個元素開始時,我們可以調(diào)用parser.nextText從XML文檔中提取所有字符數(shù)據(jù),與SAX不同的是,在PULL解析過程中觸發(fā)相應的事件調(diào)用方法返回的是數(shù)字,且我們需要自己獲取產(chǎn)生的事件然后做相應的操作,而不像SAX那樣由處理器觸發(fā)一種事件的方法從而執(zhí)行代碼。當解釋到一個文檔結(jié)束時,自動生成EndDocument事件。

核心代碼

public class MainActivity extends Activity {
  private EditText et;
  private Button myButton;
  @Override
  public void onCreate(Bundle savedInstanceState) {
      super.onCreate(savedInstanceState);
      setContentView(R.layout.activity_main);
       myButton = (Button) this.findViewById(R.id.btn01);
      et = (EditText) this.findViewById(R.id.edittext01);
      myButton.setOnClickListener(new OnClickListener() {
      //可變字符序列,比StringBuffer塊
          StringBuilder sb = new StringBuilder("");
          Resources res = getResources();
          XmlResourceParser xrp = res.getXml(R.xml.subject);
          @Override
          public void onClick(View v) {
              int counter = 0;
              try {

                  // 判斷是否到了文件的結(jié)尾
                  while (xrp.getEventType() != XmlPullParser.END_DOCUMENT) {
                      //文件的內(nèi)容的起始標簽開始,這里的起始標簽是subject.xml文件里面標簽下面的第一個標簽
                      int eventType=xrp.getEventType();
                      switch (eventType) {
                          case XmlPullParser.START_DOCUMENT:
                              break;
                          case  XmlPullParser.START_TAG:
                              String tagname = xrp.getName();
                              if (tagname.endsWith("language")) {
                                  counter++;
                                  sb.append("這是第" + counter + "種語言"+"
");
                                  //可以調(diào)用XmlPullParser的getAttributte()方法來獲取屬性的值
                                  sb.append("語言id是:"+xrp.getAttributeValue(0)+"
");
                              }
                              else if(tagname.equals("name")){
                                  //可以調(diào)用XmlPullParser的nextText()方法來獲取節(jié)點的值
                                  sb.append("語言名稱是:"+xrp.nextText()+"
");
                              }
                              else if(tagname.equals("teacher")){
                                  sb.append("用途是:"+xrp.nextText()+"
");
                              }
                              break;
                          case XmlPullParser.END_TAG:
                              break;
                          case XmlPullParser.TEXT:
                              break;
                      }
                      //解析下一個事件
                      xrp.next();
                  }
                  //StringBuilder要調(diào)用toString()方法并顯示
                  et.setText(sb.toString());
              } catch (XmlPullParserException e) {

              } catch (IOException e) {
                  e.printStackTrace();
              }
          }
      });
  }

SAX解析

工作原理:基于事件驅(qū)動,在讀取XML文檔內(nèi)容時,事件源順序地對文檔進行掃描,當掃描到文檔的開始與結(jié)束(Document)標簽、節(jié)點元素的開始與結(jié)束(Element)標簽時,直接調(diào)用對應的方法,并將狀態(tài)信息以參數(shù)的形式傳遞到方法中,然后我們可以依據(jù)狀態(tài)信息來執(zhí)行相關(guān)的自定義操作。

同樣是采用事件驅(qū)動進行解析,但相比pull解析方法,采用SAX方式進行XML解析可能會較為復雜,這里就不作實例展示,有興趣的童鞋們可以自己去嘗試下,畢竟實踐出真知!

DOM、SAX、PULL三類方式對比

DOM方式

原理:基于文檔驅(qū)動,是先把dom全部文件讀入到內(nèi)存中,構(gòu)建一個主流內(nèi)存的樹結(jié)構(gòu),然后使用DOM的API遍歷所有數(shù)據(jù),調(diào)用API檢索想要的數(shù)據(jù)和操作數(shù)據(jù)。

所以,DOM方式的優(yōu)缺點是:

特點:

**優(yōu)點**:整個文檔樹存在內(nèi)存中,可對XML文檔進行操作:刪除、修改等等;可多次訪問已解析的文檔;由于在內(nèi)存中以樹形結(jié)構(gòu)存放,因此檢索和更新效率會更高。;
**缺點**:解析 XML 文件時會將整個 XML 文件的內(nèi)容解析成樹型結(jié)構(gòu)存放在內(nèi)存中并創(chuàng)建新對象,比較消耗時間和內(nèi)存;

使用情境

對于像手機這樣的移動設(shè)備來講,內(nèi)存是非常有限的,在XML文檔比較小、需要對解析文檔進行一定的操作且一旦解析了文檔需要多次訪問這些數(shù)據(jù)的情況下可以考慮使用DOM方式,因為其檢索和解析效率較高

SAX方式

原理:基于事件驅(qū)動,在讀取XML文檔內(nèi)容時,事件源順序地對文檔進行掃描,當掃描到文檔的開始與結(jié)束(Document)標簽、節(jié)點元素的開始與結(jié)束(Element)標簽時,直接調(diào)用對應的方法,并將狀態(tài)信息以參數(shù)的形式傳遞到方法中,然后我們可以依據(jù)狀態(tài)信息來執(zhí)行相關(guān)的自定義操作。

特點:

**優(yōu)點**:解析效率高、占存少、靈活性高
**缺點**:解析方法復雜(API接口復雜),代碼量大;可拓展性差:無法對 XML 樹內(nèi)容結(jié)構(gòu)進行任何修改

使用情境

適用于需要處理大型 XML 文檔、性能要求較高、不需要對解析文檔進行修改且不需要對解析文檔多次訪問的場合

PULL方式

原理:PULL的解析方式與SAX解析類似,都是基于事件的模式。

PULL提供了開始元素和結(jié)束元素。當某個元素開始時,我們可以調(diào)用parser.nextText從XML文檔中提取所有字符數(shù)據(jù),與SAX不同的是,在PULL解析過程中觸發(fā)相應的事件調(diào)用方法返回的是數(shù)字,且我們需要自己獲取產(chǎn)生的事件然后做相應的操作,而不像SAX那樣由處理器觸發(fā)一種事件的方法從而執(zhí)行代碼。當解釋到一個文檔結(jié)束時,自動生成EndDocument事件。

特點:

**優(yōu)點**:SAX的優(yōu)點PULL都有,而且解析方法比SAX更加簡單
**缺點**:可拓展性差:無法對 XML 樹內(nèi)容結(jié)構(gòu)進行任何修改

使用情境

適用于需要處理大型 XML 文檔、性能要求較高、不需要對解析文檔進行修改且不需要對解析文檔多次訪問的場合

同樣的使用情景,在SAX和PULL解析方法中,更加推薦PULL方法

總結(jié)

本文對現(xiàn)今主流的數(shù)據(jù)傳輸格式XML進行了簡單的介紹,希望大家實踐出真知哦!

文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請注明本文地址:http://www.ezyhdfw.cn/yun/70533.html

相關(guān)文章

  • XML就是這么簡單

    什么是XML? XML:extensiable markup language 被稱作可擴展標記語言 XML簡單的歷史介紹: gml->sgml->html->xml gml(通用標記語言)–在不同的機器進行通信的數(shù)據(jù)規(guī)范 sgml(標準通用標記語言) html(超文本標記語言) 為什么我們需要使用XML呢? ①我們沒有XML這種語言之前,我們使用的是String作為兩個程序之間的通訊!現(xiàn)在問...

    pf_miles 評論0 收藏0
  • XML就是這么簡單

    什么是XML? XML:extensiable markup language 被稱作可擴展標記語言 XML簡單的歷史介紹: gml->sgml->html->xml gml(通用標記語言)–在不同的機器進行通信的數(shù)據(jù)規(guī)范 sgml(標準通用標記語言) html(超文本標記語言) 為什么我們需要使用XML呢? ①我們沒有XML這種語言之前,我們使用的是String作為兩個程序之間的通訊!現(xiàn)在問...

    yacheng 評論0 收藏0
  • XML 解析 Xml Pull Parser 和 SAX

    摘要:解析和我們在測試一個的撒的撒范德薩發(fā)大水發(fā)解析和我們在測試一個的撒的撒范德薩發(fā)大水發(fā)解析和我們在測試一個的撒的撒范德薩發(fā)大水發(fā)解析和我們在測試一個的撒的撒范德薩發(fā)大水發(fā)解析和我們在測試一個的撒的撒范德薩發(fā)大水發(fā)解析和我們在測試一個的撒的撒范 XML 解析 Xml Pull Parser 和 SAX 我們在測試一個的撒的撒范德薩發(fā)大水發(fā)XML 解析 Xml Pull Parser 和 S...

    awkj 評論0 收藏0
  • XML解析詳解|樂字節(jié)

    摘要:解析獲取解析器獲取文檔獲取根節(jié)點獲取根節(jié)點下所有的子節(jié)點,也可以根據(jù)標簽名稱獲取指定的直接點獲取元素的名稱和里面的文本創(chuàng)建創(chuàng)建節(jié)點創(chuàng)建屬性設(shè)置文本設(shè)置關(guān)系關(guān)于解析先講到這里了,請繼續(xù)關(guān)注樂字節(jié),后續(xù)超級干貨奉上,快快樂樂學。 大家好,樂字節(jié)的小樂又來了,Java技術(shù)分享哪里少的了小樂!上次我們說了可擴展標記語言XML之二:XML語言格式規(guī)范、文檔組成,本文將介紹重點——XML解析。sh...

    LinkedME2016 評論0 收藏0
  • StAX---基于事件的拉式XML解析

    摘要:而正好相反,采用一種拉的方式,由應用程序主動從解析器中獲取當前事件然后更具需求處理保存或者忽略。通過將解析器事件變成一級對象,從而讓應用程序可以采用面向?qū)ο蟮姆绞教幚硭鼈儭? 簡介 StAX,全稱Streaming API for XML,一種全新的,基于流的JAVA XML解析標準類庫。其最終版本于 2004 年 3 月發(fā)布,并成為了 JAXP 1.4(將包含在即將發(fā)布的 Java 6...

    singerye 評論0 收藏0

發(fā)表評論

0條評論

最新活動
閱讀需要支付1元查看
<