xml常用解析方式.上(相應(yīng)api的基本用法)

方式一:Dom解析(Java中使用)

直接把整個xml文檔的內(nèi)容讀到內(nèi)存中,讀取的文本內(nèi)容被組成一個樹形的結(jié)構(gòu)紊选,稱為dom樹啼止。

則整個文本內(nèi)容有不同的節(jié)點(Node)組成。通過查看api可知兵罢,Node是一個接口献烦,節(jié)點有不同的類型,Attr,Element,Document都是常見的節(jié)點卖词。


Dom解析xml的基本用法如下:

DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();

DocumentBuilder builder = factory.newDocumentBuilder();

Document document = builder.parse("books.xml"); ?//books.xml是放在項目根目錄巩那,如果是其他目錄,路徑要更換此蜈。

NodeList list = document.getElementsByTagName("作者");

Node node = list.item(1);

System.out.println(node.getTextContent());//輸出標(biāo)簽內(nèi)的文本內(nèi)容


修改Dom樹內(nèi)容即横,并寫入到磁盤,業(yè)務(wù)代碼如下:

DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();

DocumentBuilder builder = factory.newDocumentBuilder();

Document document = builder.parse("books.xml");

NodeList list = document.getElementsByTagName("售價");

Node node = list.item(1);

node.setTextContent("99.00元"); //修改標(biāo)簽節(jié)點的內(nèi)容。

TransformerFactory transformerFactory =? TransformerFactory.newInstance();

Transformer transformer = transformerFactory.newTransformer();

Source source =newDOMSource(document);

Result result =newStreamResult("books.xml");

transformer.transform(source, result);

books.xml的內(nèi)容如下:

<書架>

<書>

<書名>android開發(fā)實錄

<作者>yuewe

<售價>39.00元

<書>

<書名>Java web開發(fā)實錄

<作者>yuewe

<售價>99.00元


方式二:Sax解析(Java中使用)

Sax解析是邊讀邊解析裆赵,要注意的是解析的順序东囚,在讀到結(jié)束標(biāo)簽的時候,下一個讀到往往是標(biāo)簽內(nèi)容而不是開始標(biāo)簽战授。Sax解析的邏輯是通過實現(xiàn)一個ContentHandler里面相應(yīng)的方法(處理的邏輯寫在相應(yīng)的方法里面)并設(shè)置給XMLReader來實現(xiàn)的页藻。

業(yè)務(wù)代碼如下:

SAXParserFactory saxParserFactory = SAXParserFactory.newInstance();

SAXParser saxParser = saxParserFactory.newSAXParser();

XMLReader reader = saxParser.getXMLReader();

reader.setContentHandler(newDefaultHandler() {

booleanisshow=false;

@Override

public voidstartElement(String uri, String localName, String qName, Attributes attributes)throwsSAXException {

if(qName.equals("售價")) {

isshow=true;

}

}

@Override

public voidendElement(String uri, String localName, String qName)throwsSAXException {

if(qName.equals("售價")) {

isshow=false;

}

}

@Override

public voidcharacters(char[] ch,intstart,intlength)throwsSAXException {

if(isshow) {

String content =newString(ch, start, length);

System.out.println(content);

}

}

});

reader.parse("books.xml");

方式三:Pull解析(Android主要使用)

pull解析主要是用于Android上,Java上也要用的話植兰,要添加相應(yīng)的jar包份帐。pull解析與sax解析相似,但是用法有點不一樣钉跷。而且sax解析一開始就要解析到末尾,而pull解析則是通過調(diào)用xmlPullParser.next()方法來解析下一部分(這里不是太清楚肚逸,以后有空測試是不是一次next解析一行)爷辙。

直接上代碼:

XmlPullParserFactory xmlPullParserFactory = XmlPullParserFactory.newInstance();

XmlPullParser xmlPullParser = xmlPullParserFactory.newPullParser();

xmlPullParser.setInput(newFileInputStream(newFile("books.xml")),"utf-8");

inttype = xmlPullParser.getEventType();

List books =newArrayList<>();

Book b =null;

while(type != XmlPullParser.END_DOCUMENT) {

switch(type) {

caseXmlPullParser.START_TAG:

if(xmlPullParser.getName().equals("書名")) {

b.setTitle(xmlPullParser.nextText());

}else if(xmlPullParser.getName().equals("書")) {

b =newBook();

}else if(xmlPullParser.getName().equals("作者")) {

b.setAuthor(xmlPullParser.nextText());

}else if(xmlPullParser.getName().equals("售價")) {

b.setPrice(xmlPullParser.nextText());

}

;

break;

caseXmlPullParser.END_TAG:

if(xmlPullParser.getName().equals("書")) {

books.add(b);

}

;

break;

}

type = xmlPullParser.next();

}

for(Book book : books) {

System.out.println(book);

}

}


總結(jié):考慮到一些應(yīng)用場景和一些限制,Android端基本用的都是自帶帶的pull解析朦促,而dom解析一次把數(shù)據(jù)讀取到內(nèi)存中膝晾,很耗內(nèi)存。而Android系統(tǒng)給每個應(yīng)用分配的內(nèi)存是固定的务冕,雖然可以通過添加多進程的方式添加內(nèi)存血当,但這也提高了難度,所以Android端使用sax或pull解析xml比較合適,但就是不能修改文件臊旭。



本文是作者通過學(xué)習(xí)Android黑馬視頻做的一些筆記落恼,侵刪,郵箱號m13978575424@163.com离熏。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末佳谦,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子滋戳,更是在濱河造成了極大的恐慌钻蔑,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,451評論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件奸鸯,死亡現(xiàn)場離奇詭異咪笑,居然都是意外死亡,警方通過查閱死者的電腦和手機娄涩,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,172評論 3 394
  • 文/潘曉璐 我一進店門窗怒,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人钝满,你說我怎么就攤上這事兜粘。” “怎么了弯蚜?”我有些...
    開封第一講書人閱讀 164,782評論 0 354
  • 文/不壞的土叔 我叫張陵孔轴,是天一觀的道長。 經(jīng)常有香客問我碎捺,道長路鹰,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,709評論 1 294
  • 正文 為了忘掉前任收厨,我火速辦了婚禮晋柱,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘诵叁。我一直安慰自己雁竞,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 67,733評論 6 392
  • 文/花漫 我一把揭開白布拧额。 她就那樣靜靜地躺著碑诉,像睡著了一般。 火紅的嫁衣襯著肌膚如雪侥锦。 梳的紋絲不亂的頭發(fā)上进栽,一...
    開封第一講書人閱讀 51,578評論 1 305
  • 那天,我揣著相機與錄音恭垦,去河邊找鬼快毛。 笑死格嗅,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的唠帝。 我是一名探鬼主播屯掖,決...
    沈念sama閱讀 40,320評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼没隘!你這毒婦竟也來了懂扼?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,241評論 0 276
  • 序言:老撾萬榮一對情侶失蹤右蒲,失蹤者是張志新(化名)和其女友劉穎阀湿,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體瑰妄,經(jīng)...
    沈念sama閱讀 45,686評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡陷嘴,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,878評論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了间坐。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片灾挨。...
    茶點故事閱讀 39,992評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖竹宋,靈堂內(nèi)的尸體忽然破棺而出劳澄,到底是詐尸還是另有隱情,我是刑警寧澤蜈七,帶...
    沈念sama閱讀 35,715評論 5 346
  • 正文 年R本政府宣布秒拔,位于F島的核電站,受9級特大地震影響飒硅,放射性物質(zhì)發(fā)生泄漏砂缩。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,336評論 3 330
  • 文/蒙蒙 一三娩、第九天 我趴在偏房一處隱蔽的房頂上張望庵芭。 院中可真熱鬧,春花似錦雀监、人聲如沸双吆。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,912評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽好乐。三九已至,卻和暖如春回官,著一層夾襖步出監(jiān)牢的瞬間曹宴,已是汗流浹背搂橙。 一陣腳步聲響...
    開封第一講書人閱讀 33,040評論 1 270
  • 我被黑心中介騙來泰國打工歉提, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留笛坦,地道東北人。 一個月前我還...
    沈念sama閱讀 48,173評論 3 370
  • 正文 我出身青樓苔巨,卻偏偏與公主長得像版扩,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子侄泽,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,947評論 2 355

推薦閱讀更多精彩內(nèi)容

  • 1 XML解析No29 【 XML:可拓展標(biāo)記語言礁芦,語言和HTML類似,也是一種標(biāo)記語言悼尾。 特點:標(biāo)記是自定義...
    征程_Journey閱讀 1,651評論 0 9
  • 一柿扣、iOS 4種JSON數(shù)據(jù)解析方法詳解 2013年09月10日? 綜合? 共 9124字? 字號小中大?評論關(guān)閉...
    lilinjianshu閱讀 2,056評論 0 2
  • 1. Java基礎(chǔ)部分 基礎(chǔ)部分的順序:基本語法,類相關(guān)的語法闺魏,內(nèi)部類的語法未状,繼承相關(guān)的語法,異常的語法析桥,線程的語...
    子非魚_t_閱讀 31,632評論 18 399
  • 一司草、緒論 上周工作需要了解項目的一些大體內(nèi)容,結(jié)果在xml解析這一塊看的迷迷糊糊的泡仗,所以在這里把學(xué)習(xí)到xm...
    cao健強閱讀 4,040評論 1 7
  • 看完The Horse Dealer's Daughter 埋虹,想起老友記暗戀的復(fù)雜心情(瑞秋to喬伊) 明明很在意...
    去社閱讀 269評論 1 0