JAVA基礎(chǔ)-XML的解析(二)

三、XML的解析

XML的解析一共有2種方式:DOM解析:(DOM:Document Object Model)SAX解析:(Simple Api for XML)
    * DOM:文檔對(duì)象模型。這種方式是W3C推薦的處理XML的一種方式沦辙。
    * SAX:這種方式不是官方標(biāo)準(zhǔn)总寻,屬于開(kāi)源社區(qū)XML-DEV荧关,幾乎所有的XML解析器都支持它抛猖。
  兩者的解析方式的優(yōu)缺點(diǎn)
    * DOM解析是一次把DOM樹(shù)都加載到內(nèi)存里進(jìn)行解析,可以對(duì)其進(jìn)行增刪改格仲,但是當(dāng)解析的XML比較大的
時(shí)候可能會(huì)造成內(nèi)存溢出。
    * SAX解析是以事件驅(qū)動(dòng)的方式一行一行進(jìn)行解析的诵冒,不會(huì)造成內(nèi)存的溢出凯肋,但是不能對(duì)XML進(jìn)行修改。
  針對(duì)這兩種解析的方式汽馋,不同的公司提供了不同的API的實(shí)現(xiàn)
    * JAXP :SUN公司提供的一套XML的解析的API.
    * JDOM :開(kāi)源組織提供了一套XML的解析的API-jdom.
    * DOM4J :開(kāi)源組織提供了一套XML的解析的API-dom4j.
    * pull :主要應(yīng)用在Android手機(jī)端解析XML.
  java中常用的API為DOM4J侮东。

(一)DOM4J

DOM4J的常用的構(gòu)造和方法:
    * 創(chuàng)建SAXReader對(duì)象:new SAXReader()
    * 設(shè)置讀取路徑返回Document對(duì)象對(duì)XML進(jìn)行操作:
      reader.read(要讀取XML的路徑);
    * 創(chuàng)建OutputFormat對(duì)象設(shè)定輸出格式: OutputFormat.createPrettyPrint()
    * 根據(jù)輸出路徑和輸出格式創(chuàng)建輸出對(duì)象:
      new XMLWriter(new FileOutputStream(輸出路徑, 輸出格式);
  DOM4J的常用方法:
    * 獲取根元素對(duì)象(根標(biāo)簽):
      返回值類(lèi)型 - Element,調(diào)用對(duì)象 - Document getRootElement();
    * 獲取所有的子元素:
      返回值類(lèi)型 - List ,調(diào)用對(duì)象 - Element elements();
    * 根據(jù)指定的元素名稱(chēng)來(lái)獲取相應(yīng)的所有的子元素:
      返回值類(lèi)型 - List ,調(diào)用對(duì)象 - Element elements(String name);
    * 根據(jù)指定的子元素名稱(chēng),來(lái)獲取子元素中的文本:
      返回值類(lèi)型 - String ,調(diào)用對(duì)象 - Element elementText(String name);
    * 獲取當(dāng)前元素對(duì)象的文本:
      返回值類(lèi)型 - String ,調(diào)用對(duì)象 - Element getText();
    * 設(shè)置當(dāng)前元素對(duì)象的文本:
      返回值類(lèi)型 - void ,調(diào)用對(duì)象 - Element setText(String text);
    * 添加當(dāng)前元素對(duì)象的文本:
      返回值類(lèi)型 - Element ,調(diào)用對(duì)象 - Element addText(String text);
    * 根據(jù)指定的屬性名稱(chēng)獲取其對(duì)應(yīng)的值:
      返回值類(lèi)型 - String ,調(diào)用對(duì)象 - Element attributeValue(String name);
    * 根據(jù)指定的屬性名稱(chēng)和值進(jìn)行添加或者修改:
      返回值類(lèi)型 - Element ,調(diào)用對(duì)象 - Element addAttribute(String name,String value);
    * 刪除某一元素(需父類(lèi)對(duì)象刪除子元素):
      返回值類(lèi)型 - void ,調(diào)用對(duì)象 - Element remove(Element element);
    * 在目標(biāo)節(jié)點(diǎn)中添加新的節(jié)點(diǎn):
      返回值類(lèi)型 - Element ,調(diào)用對(duì)象 - Element addElement(String name);
    * 創(chuàng)建一個(gè)新的元素對(duì)象:
      返回值類(lèi)型 - Element豹芯,調(diào)用對(duì)象 - DocumentHelper DocumentHelper.createElement(String name);

(二)示例代碼

* 目標(biāo)XML文件:

 1 <?xml version="1.0" encoding="UTF-8"?>
 2 
 3 <State Code="37" Name="河南" description="鄭州" GDP="99999億" YY="你YY個(gè)啥勁兒">
 4 <City>
 5 <Name>鄭州</Name>
 6 <Region>高薪區(qū)</Region>
 7 </City>
 8 <City>普吉島</City>
 9 <City>三門(mén)峽</City>
10 <City>安陽(yáng)</City>
11 <City>南陽(yáng)</City>
12 <City>北京</City>
13 </State>

工具類(lèi):

 1 public class Dom4jUtils {
 2 //私有構(gòu)造
 3 private Dom4jUtils() {
 4 super();
 5 // TODO Auto-generated constructor stub
 6 }
 7 //創(chuàng)建Document對(duì)象
 8 public static Document creatDocument() throws Exception {
 9 SAXReader reader = new SAXReader();
10 Document document = reader.read("src\\com\\xmldemo\\city.xml");
11 return document;
12 }
13 //創(chuàng)建輸出對(duì)象
14 public static void write(Document d) throws Exception {
15 OutputFormat format = OutputFormat.createPrettyPrint();
16 XMLWriter writer = new XMLWriter(new FileOutputStream("src\\com\\xmldemo\\city.xml"), format);
17 writer.write(d);
18 }
19 }

一頓操作:

 1 /**添加或修改屬性,如果沒(méi)有該屬性就添加有的話就更新
  2 * @throws Exception
  3 */
  4 private static void method07() throws Exception {
  5 Document document = Dom4jTUtils.creatDocument();
  6 Element rootElement = document.getRootElement();
  7 //為根元素添加YY屬性和值
  8 Element element = rootElement.addAttribute("YY", "你YY個(gè)啥勁兒");
  9 Dom4jTUtils.write(document);
 10 }
 11 
 12 /**打印某一節(jié)點(diǎn)的屬性
 13 * @throws Exception
 14 */
 15 private static void method06() throws Exception {
 16 Document document = Dom4jTUtils.creatDocument();
 17 Element rootElement = document.getRootElement();
 18 //獲取Name屬性的值
 19 String value = rootElement.attributeValue("Name");
 20 System.out.println(value);
 21 }
 22 
 23 /**在某一標(biāo)簽位置添加新標(biāo)簽
 24 * @throws Exception
 25 */
 26 private static void method05() throws Exception {
 27 Document document = Dom4jTUtils.creatDocument();
 28 Element rootElement = document.getRootElement();
 29 // 創(chuàng)建一個(gè)新元素對(duì)象
 30 Element createElement = DocumentHelper.createElement("City");
 31 //為此元素設(shè)置值
 32 createElement.setText("普吉島");
 33 //遍歷
 34 List<Element> list = rootElement.elements();
 35 //將此節(jié)點(diǎn)加入到list集合的指定位置
 36 list.add(1, createElement);
 37 //寫(xiě)回
 38 Dom4jTUtils.write(document);
 39 }
 40 
 41 
 42 /**像某已指定元素添加元素
 43 * @throws Exception
 44 */
 45 private static void method04() throws Exception {
 46 Document document = Dom4jTUtils.creatDocument();
 47 Element rootElement = document.getRootElement();
 48 //在Root節(jié)點(diǎn)下添加一個(gè)新節(jié)點(diǎn)"City"
 49 Element addElement = rootElement.addElement("City");
 50 //為節(jié)點(diǎn)添加文本
 51 addElement.addText("北京");
 52 //寫(xiě)回
 53 Dom4jTUtils.write(document);
 54 }
 55 
 56 
 57 /**刪除某一元素
 58 * @throws Exception
 59 */
 60 private static void methed03() throws Exception {
 61 Document document = Dom4jTUtils.creatDocument();
 62 Element rootElement = document.getRootElement();
 63 List<Element> list = rootElement.elements();
 64 //獲取要?jiǎng)h除元素的父元素(刪除只能由父親刪除兒子)
 65 Element parent = list.get(2).getParent();
 66 //刪除
 67 parent.remove(list.get(2));
 68 //將document寫(xiě)回
 69 Dom4jTUtils.write(document);
 70 }
 71 
 72 /**修改某一標(biāo)簽的文本
 73 * @throws Exception(為了方便拋出大的異常)
 74 */
 75 private static void medom02() throws Exception {
 76 Document document = Dom4jTUtils.creatDocument();
 77 Element rootElement = document.getRootElement();
 78 List<Element> list = rootElement.elements();
 79 //設(shè)置第三個(gè)元素的文本
 80 list.get(2).setText("青青草原");
 81 //使用工具類(lèi)將document寫(xiě)回XML文檔
 82 Dom4jTUtils.write(document);
 83 }
 84 
 85 /**獲取第一個(gè)元素的Name屬性
 86 * @throws Exception(為了方便拋出大的異常)
 87 */
 88 private static void method() throws Exception {
 89 //使用工具類(lèi)創(chuàng)建Document對(duì)象
 90 Document document = Dom4jTUtils.creatDocument();
 91 //獲得根節(jié)點(diǎn)
 92 Element element = document.getRootElement();
 93 //獲得根節(jié)點(diǎn)下的所有元素節(jié)點(diǎn)
 94 List<Element> elements = element.elements();
 95 //獲取第一個(gè)節(jié)點(diǎn)的Name屬性文本
 96 String name = elements.get(0).elementText("Name");
 97 System.out.println(name);
 98 }
 99 
100 
101 /**用遞歸的方式遍歷所有元素
102 * @param elements 根節(jié)點(diǎn)
103 */
104 public static void run(Element elements) {
105 //打印每個(gè)元素的名字
106 System.out.println(elements.getName());
107 //獲取每個(gè)節(jié)點(diǎn)
108 List<Element> elements2 = elements.elements();
109 //遞歸調(diào)用
110 for (Element object : elements2) {
111 run(object);
112 }
113 }

歡迎加入學(xué)習(xí)交流群569772982悄雅,大家一起學(xué)習(xí)交流。

object : elements2) {111 run(object);112 }113 }

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末告组,一起剝皮案震驚了整個(gè)濱河市煤伟,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌木缝,老刑警劉巖便锨,帶你破解...
    沈念sama閱讀 210,914評(píng)論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異我碟,居然都是意外死亡放案,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 89,935評(píng)論 2 383
  • 文/潘曉璐 我一進(jìn)店門(mén)矫俺,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)吱殉,“玉大人掸冤,你說(shuō)我怎么就攤上這事∮仰ǎ” “怎么了稿湿?”我有些...
    開(kāi)封第一講書(shū)人閱讀 156,531評(píng)論 0 345
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)押赊。 經(jīng)常有香客問(wèn)我饺藤,道長(zhǎng),這世上最難降的妖魔是什么流礁? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 56,309評(píng)論 1 282
  • 正文 為了忘掉前任涕俗,我火速辦了婚禮,結(jié)果婚禮上神帅,老公的妹妹穿的比我還像新娘再姑。我一直安慰自己,他們只是感情好找御,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,381評(píng)論 5 384
  • 文/花漫 我一把揭開(kāi)白布元镀。 她就那樣靜靜地躺著,像睡著了一般萎坷。 火紅的嫁衣襯著肌膚如雪凹联。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 49,730評(píng)論 1 289
  • 那天哆档,我揣著相機(jī)與錄音蔽挠,去河邊找鬼。 笑死瓜浸,一個(gè)胖子當(dāng)著我的面吹牛澳淑,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播插佛,決...
    沈念sama閱讀 38,882評(píng)論 3 404
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼杠巡,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了雇寇?” 一聲冷哼從身側(cè)響起氢拥,我...
    開(kāi)封第一講書(shū)人閱讀 37,643評(píng)論 0 266
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎锨侯,沒(méi)想到半個(gè)月后嫩海,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,095評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡囚痴,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,448評(píng)論 2 325
  • 正文 我和宋清朗相戀三年叁怪,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片深滚。...
    茶點(diǎn)故事閱讀 38,566評(píng)論 1 339
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡奕谭,死狀恐怖涣觉,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情血柳,我是刑警寧澤官册,帶...
    沈念sama閱讀 34,253評(píng)論 4 328
  • 正文 年R本政府宣布,位于F島的核電站混驰,受9級(jí)特大地震影響攀隔,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜栖榨,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,829評(píng)論 3 312
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望明刷。 院中可真熱鬧婴栽,春花似錦、人聲如沸辈末。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,715評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)挤聘。三九已至轰枝,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間组去,已是汗流浹背鞍陨。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 31,945評(píng)論 1 264
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留从隆,地道東北人诚撵。 一個(gè)月前我還...
    沈念sama閱讀 46,248評(píng)論 2 360
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像键闺,于是被迫代替她去往敵國(guó)和親寿烟。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,440評(píng)論 2 348

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

  • 1. Java基礎(chǔ)部分 基礎(chǔ)部分的順序:基本語(yǔ)法辛燥,類(lèi)相關(guān)的語(yǔ)法筛武,內(nèi)部類(lèi)的語(yǔ)法,繼承相關(guān)的語(yǔ)法挎塌,異常的語(yǔ)法徘六,線程的語(yǔ)...
    子非魚(yú)_t_閱讀 31,597評(píng)論 18 399
  • 1 場(chǎng)景問(wèn)題# 1.1 讀取配置文件## 考慮這樣一個(gè)實(shí)際的應(yīng)用,維護(hù)系統(tǒng)自定義的配置文件勃蜘。 幾乎每個(gè)實(shí)際的應(yīng)用系...
    七寸知架構(gòu)閱讀 3,095評(píng)論 2 56
  • 1. XML總結(jié) 1.1. XML簡(jiǎn)介 XML : 可擴(kuò)展的標(biāo)記語(yǔ)言硕噩。(和HTML非常類(lèi)似的) 可擴(kuò)展的。 自定義...
    Ethan_Walker閱讀 2,997評(píng)論 0 12
  • 招人要慢缭贡,炒人要快 以前剛創(chuàng)業(yè)的時(shí)候炉擅,我特傻逼辉懒,覺(jué)得我們要建立一種很酷的文化。招人不需要什么繁文縟節(jié)谍失,面試的時(shí)候眶俩,...
    我是蕭晨閱讀 414評(píng)論 1 1
  • 9月1號(hào)中午,樂(lè)視商城微博發(fā)布“樂(lè)視商城暫停超級(jí)電視和超級(jí)手機(jī)現(xiàn)貨搶購(gòu)”通知快鱼。通知稱(chēng)颠印,“為回饋樂(lè)迷的大力支持,樂(lè)視...
    f11015f29d83閱讀 262評(píng)論 0 1