摘要:我們解析的最終目的當然就是獲得數據的值。所以,方式的優缺點是特點優點整個文檔樹存在內存中,可對文檔進行操作刪除修改等等可多次訪問已解析的文檔由于在內存中以樹形結構存放,因此檢索和更新效率會更高。
目錄 定義
XML(extensible Markup Language) ,是一種數據標記語言 & 傳輸格式
作用對數據進行標記(結構化數據)
對數據進行存儲
對數據進行傳輸
XML特點與html的區別:html用于顯示信息;xml用于存儲&傳輸信息
標簽可進行自定義
XML允許作者定義自己的標簽和文檔結構
自我描述性
> **XML文檔實例** > > ``` > > >> > > > ``` > > 僅僅是一個純文本,有文本處理能力的軟件都可以處理xmlGeorge >John >Reminder > Dont"t forget the meeting! > >
可拓展性
在不中斷解析、應用程序的情況下進行拓展。
可跨平臺數據傳輸
可在不兼容的系統之間進行交換數據,降低了復雜性
數據共享方便
XML以純文本進行存儲,獨立于軟件、硬件和應用程序的數據存儲方式,使得不同應用程序、軟件和硬件都能訪問xml的數據語法
元素要關閉標簽
`< p >this is a bitch`
對大小寫敏感
< P >這是錯誤的< p >這是正確的
必須要有根元素(父元素)
屬性值必須加引號
實體引用
實體引用 | 符號 | 含義 |
---|---|---|
<; | < | 小于 |
> ; | > | 大于 |
&; | & | 和浩 |
&apos; | ‘ | 單引號 |
"; | " | 雙引號 |
元素不能使用&(實體的開始)和<(新元素的開始)
注釋
``
XML的元素、屬性和屬性值
> 文檔實例 > > ``` >> > ``` > > 其中,> >Harry Potter >JK.Rowling >> >woshiPM >Carson_Ho >是根元素; 是子元素,也是元素類型之一;而 中含有屬性,即category,屬性值是CHILDREN;而元素 則擁有文本內容( JK.Rowling)
元素與屬性的差別
屬性即提供元素額外的信息,但不屬于數據組成部分的信息。 > 范例一 > > ``` >> > > ``` > > 范例二 > > ``` >Harry Potter >JK.Rowling >> > > ``` > > 范例一和二提供的信息是完全相同的。CHILDREN > Harry Potter >JK.Rowling >
一般情況下,請使用元素,因為
屬性無法描述樹結構(元素可以)
屬性不容易拓展(元素可以)
使用屬性的情況:用于分配ID索引,用于標識XML元素。
實例
CHILDREN Harry Potter JK.Rowling CHILDREN Harry Potter JK.Rowling 上述屬性(id)僅用于標識不同的便簽,并不是數據的組成部分
XML元素命名規則
不能以數字或標點符號開頭
不能包含空格
不能以xml開頭
CDATA
不被解析器解析的文本數據,所有xml文檔都會被解析器解析(cdata區段除外)
PCDATA
被解析的字符數據
XML文檔中的元素會形成一種樹結構,從根部開始,然后拓展到每個樹葉(節點),下面將以實例說明XML的樹結構。
假設一個XML文件如下
<?xml version ="1.0" encoding="UTF-8"?> <簡歷> <基本資料> <求職意向> <自我評價> <其他信息> <聯系方式> <我的作品> 簡歷>
其樹結構如下
XML節點解釋
XML文件是由節點構成的。它的第一個節點為“根節點”。一個XML文件必須有且只能有一個根節點,其他節點都必須是它的子節點。
this 代表整個XML文件,它的根節點就是 this.firstChild 。 this.firstChild.childNodes 則返回由根節點的所有子節點組成的節點數組。
每個子節點又可以有自己的子節點。節點編號由0開始,根節點的第一個子節點為 this.firstChild.childNodes[0],它的子節點數組就是this.firstChild.childNodes[0].childNodes 。
根節點第一個子節點的第二個子節點 this.firstChild.childNodes[0].childNodes[1],它返回的是一個XML對象(Object) 。這里需要特別注意,節點標簽之間的數據本身也視為一個節點 this.firstChild.childNodes[0].childNodes[1].firstChild ,而不是一個值。
我們解析XML的最終目的當然就是獲得數據的值:
this.firstChild.childNodes[0].childNodes[1].firstChild.nodeValue 。
請注意區分:節點名稱(<性別>性別>)和之間的文本內容(男)可以當作是節點,也可以當作是一個值
節點:
名稱:this.firstChild.childNodes[0].childNodes[1]
文本內容:this.firstChild.childNodes[0].childNodes[1].firstChild值:
名稱:this.firstChild.childNodes[0].childNodes[1].nodeValue
(節點名稱有時也是我們需要的數據)
文本內容:this.firstChild.childNodes[0].childNodes[1].nodeName
在了解完XML之后,是時候來學下如何進行XML的解析了
XML解析解析XML,即從XML中提取有用的信息
基于文檔驅動方式
主流方式:DOM方式
簡介:XML DOM(XML Document Object Model),XML文件對象模型,定義了訪問和操作xml文檔元素的方法和接口
工作原理: DOM是基于樹形結構的的節點的文檔驅動方法。使用DOM對XML文件進行操作時,首先解析器讀入整個XML文檔到內存中,然后解析全部文件,并將文件分為獨立的元素、屬性等,以樹結構的形式在內存中對XML文件進行表示,開發人員通過使用DOM API遍歷XML樹,根據需要修改文檔或檢索所需數據
假設需要解析的XML文檔如下(subject.xml)
<?xml version ="1.0" encoding="UTF-8"?>`
Java
Android
Swift#
iOS
Html5
Web
核心代碼
public static ListgetSubjectList(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對象數據 Document document = builder.parse(stream); //得到 XML數據的"根節點" Element element = document.getDocumentElement(); //獲取根節點的所有language的節點 NodeList list = element.getElementsByTagName("language"); //遍歷所有節點 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()+" "); }
總結Dom解析的步驟
1、調用 DocumentBuilderFactory.newInstance() 方法得到 DOM 解析器工廠類實例。
2、調用解析器工廠實例類的 newDocumentBuilder() 方法得到 DOM 解析器對象
3、調用 DOM 解析器對象的 parse() 方法解析 XML 文檔得到代表整個文檔的 Document 對象。
基于事件驅動
主流方式:SAX、PULL方式
解析方式:可直接根據需要讀取所需的JSON數據,不需要像DOM方法把文檔先入到內存中
工作原理:PULL的解析方式與SAX解析類似,都是基于事件的模式。
PULL提供了開始元素和結束元素。當某個元素開始時,我們可以調用parser.nextText從XML文檔中提取所有字符數據,與SAX不同的是,在PULL解析過程中觸發相應的事件調用方法返回的是數字,且我們需要自己獲取產生的事件然后做相應的操作,而不像SAX那樣由處理器觸發一種事件的方法從而執行代碼。當解釋到一個文檔結束時,自動生成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 { // 判斷是否到了文件的結尾 while (xrp.getEventType() != XmlPullParser.END_DOCUMENT) { //文件的內容的起始標簽開始,這里的起始標簽是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 + "種語言"+" "); //可以調用XmlPullParser的getAttributte()方法來獲取屬性的值 sb.append("語言id是:"+xrp.getAttributeValue(0)+" "); } else if(tagname.equals("name")){ //可以調用XmlPullParser的nextText()方法來獲取節點的值 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要調用toString()方法并顯示 et.setText(sb.toString()); } catch (XmlPullParserException e) { } catch (IOException e) { e.printStackTrace(); } } }); }
SAX解析
工作原理:基于事件驅動,在讀取XML文檔內容時,事件源順序地對文檔進行掃描,當掃描到文檔的開始與結束(Document)標簽、節點元素的開始與結束(Element)標簽時,直接調用對應的方法,并將狀態信息以參數的形式傳遞到方法中,然后我們可以依據狀態信息來執行相關的自定義操作。
同樣是采用事件驅動進行解析,但相比pull解析方法,采用SAX方式進行XML解析可能會較為復雜,這里就不作實例展示,有興趣的童鞋們可以自己去嘗試下,畢竟實踐出真知!
DOM、SAX、PULL三類方式對比DOM方式
原理:基于文檔驅動,是先把dom全部文件讀入到內存中,構建一個主流內存的樹結構,然后使用DOM的API遍歷所有數據,調用API檢索想要的數據和操作數據。
所以,DOM方式的優缺點是:
特點:
**優點**:整個文檔樹存在內存中,可對XML文檔進行操作:刪除、修改等等;可多次訪問已解析的文檔;由于在內存中以樹形結構存放,因此檢索和更新效率會更高。; **缺點**:解析 XML 文件時會將整個 XML 文件的內容解析成樹型結構存放在內存中并創建新對象,比較消耗時間和內存;
使用情境
對于像手機這樣的移動設備來講,內存是非常有限的,在XML文檔比較小、需要對解析文檔進行一定的操作且一旦解析了文檔需要多次訪問這些數據的情況下可以考慮使用DOM方式,因為其檢索和解析效率較高
SAX方式
原理:基于事件驅動,在讀取XML文檔內容時,事件源順序地對文檔進行掃描,當掃描到文檔的開始與結束(Document)標簽、節點元素的開始與結束(Element)標簽時,直接調用對應的方法,并將狀態信息以參數的形式傳遞到方法中,然后我們可以依據狀態信息來執行相關的自定義操作。
特點:
**優點**:解析效率高、占存少、靈活性高 **缺點**:解析方法復雜(API接口復雜),代碼量大;可拓展性差:無法對 XML 樹內容結構進行任何修改
使用情境
適用于需要處理大型 XML 文檔、性能要求較高、不需要對解析文檔進行修改且不需要對解析文檔多次訪問的場合
PULL方式
原理:PULL的解析方式與SAX解析類似,都是基于事件的模式。
PULL提供了開始元素和結束元素。當某個元素開始時,我們可以調用parser.nextText從XML文檔中提取所有字符數據,與SAX不同的是,在PULL解析過程中觸發相應的事件調用方法返回的是數字,且我們需要自己獲取產生的事件然后做相應的操作,而不像SAX那樣由處理器觸發一種事件的方法從而執行代碼。當解釋到一個文檔結束時,自動生成EndDocument事件。
特點:
**優點**:SAX的優點PULL都有,而且解析方法比SAX更加簡單 **缺點**:可拓展性差:無法對 XML 樹內容結構進行任何修改
使用情境
適用于需要處理大型 XML 文檔、性能要求較高、不需要對解析文檔進行修改且不需要對解析文檔多次訪問的場合
同樣的使用情景,在SAX和PULL解析方法中,更加推薦PULL方法
總結本文對現今主流的數據傳輸格式XML進行了簡單的介紹,希望大家實踐出真知哦!
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/70533.html
摘要:解析和我們在測試一個的撒的撒范德薩發大水發解析和我們在測試一個的撒的撒范德薩發大水發解析和我們在測試一個的撒的撒范德薩發大水發解析和我們在測試一個的撒的撒范德薩發大水發解析和我們在測試一個的撒的撒范德薩發大水發解析和我們在測試一個的撒的撒范 XML 解析 Xml Pull Parser 和 SAX 我們在測試一個的撒的撒范德薩發大水發XML 解析 Xml Pull Parser 和 S...
摘要:解析獲取解析器獲取文檔獲取根節點獲取根節點下所有的子節點,也可以根據標簽名稱獲取指定的直接點獲取元素的名稱和里面的文本創建創建節點創建屬性設置文本設置關系關于解析先講到這里了,請繼續關注樂字節,后續超級干貨奉上,快快樂樂學。 大家好,樂字節的小樂又來了,Java技術分享哪里少的了小樂!上次我們說了可擴展標記語言XML之二:XML語言格式規范、文檔組成,本文將介紹重點——XML解析。sh...
摘要:而正好相反,采用一種拉的方式,由應用程序主動從解析器中獲取當前事件然后更具需求處理保存或者忽略。通過將解析器事件變成一級對象,從而讓應用程序可以采用面向對象的方式處理它們。 簡介 StAX,全稱Streaming API for XML,一種全新的,基于流的JAVA XML解析標準類庫。其最終版本于 2004 年 3 月發布,并成為了 JAXP 1.4(將包含在即將發布的 Java 6...
閱讀 930·2021-11-22 12:09
閱讀 3704·2021-09-27 13:36
閱讀 1391·2021-08-20 09:37
閱讀 4008·2019-12-27 12:22
閱讀 2353·2019-08-30 15:55
閱讀 2359·2019-08-30 13:16
閱讀 2818·2019-08-26 17:06
閱讀 3434·2019-08-23 18:32