DOM解析準(zhǔn)備工作
??
??
---------------------------------------------------->
DocumentBuilderFactory.newInstance創(chuàng)建對(duì)象
DocumentBuilder創(chuàng)建對(duì)象
Document? .parse("文件名”)進(jìn)行xml解析
NodeList? .getElementsByTagName("節(jié)點(diǎn)名“)? 找節(jié)點(diǎn)
for循環(huán)實(shí)現(xiàn)? ? ----->>>? ? Node? ? .item(i)? 遍歷獲取各屬性插勤。
??
常用節(jié)點(diǎn)類(lèi)型
??
解析xml節(jié)點(diǎn)名和節(jié)點(diǎn)值
----------------》》》》》
NodeList? .getChildNodes()? 獲取所有屬性的子節(jié)點(diǎn)
通過(guò) 子節(jié)點(diǎn)實(shí)現(xiàn)? .getNodeType()? ? ==? Node.ELEMENT_NODE判斷類(lèi)型是否是空格铺然,換行類(lèi)型
子節(jié)點(diǎn)第一節(jié)點(diǎn)值輸出方式:? ? ? childNodes.item(k).getFirstChild().getNodeValue()
直接輸出子節(jié)點(diǎn)內(nèi)所有值方式:? childNodes.item(k).getTextContent()
??
SAX解析XML
步驟:
??
??
??
------------------》》》》》》
??
----------------》》》》》》
??
----------------》》》》》》
使用SAX解析將XML的內(nèi)容和結(jié)果保存到JAVA中
=====》》》》創(chuàng)建全局的value和book對(duì)象
=====》》》》用集合AarryList來(lái)存儲(chǔ)book對(duì)象
??
=====》》》》startElement開(kāi)始后就創(chuàng)建新的book對(duì)象
??
====》》》》endElement后將book存進(jìn)集合中儲(chǔ)存硫戈,再將book對(duì)象清空
====》》》》依次判斷qName是否是需要的節(jié)點(diǎn)名稱(chēng)致开,進(jìn)行book屬性賦值
??
====》》》》在characters中用value 接收所有的節(jié)點(diǎn)值杠园,如果節(jié)點(diǎn)值不為空格或者換行就輸出
??
JDOM開(kāi)始解析前的準(zhǔn)備工作
====》》》》先導(dǎo)入JDOM的jar包
====》》》》創(chuàng)建SAXBuilder對(duì)象
====》》》》InputStream將xml文件寫(xiě)入
??
====》》》》saxBuilder的build方法加載輸入流
====》》》》用Document獲取輸入流
====》》》》Element的getRootElement()獲取根節(jié)點(diǎn)
====》》》》用List接收根節(jié)點(diǎn)的子節(jié)點(diǎn):.getChildren()
??
====》》》》繼續(xù)解析,遍歷輸出bookList里每個(gè)bool屬性的位置(也就是第幾本)
??
====》》》》用List來(lái)接收每個(gè)屬性的屬性值? .getAttributes()
====》》》》遍歷輸出屬性名和屬性值
??
====》》》》對(duì)屬性的子節(jié)點(diǎn)進(jìn)行遍歷獲取子節(jié)點(diǎn)名和子節(jié)點(diǎn)值? 節(jié)點(diǎn).getChildren()
??
===》》? 》》? ? JDOM 解析時(shí)亂碼的處理
1. encoding改為UTF-8
2.====>>>> 調(diào)用InputStreamrReader的切換編碼解析方法
??
====》》》》 在JDOM中儲(chǔ)存Book對(duì)象
====》》》》先創(chuàng)建集合為Book類(lèi)型慕淡,并為全局私有
??
====》》》》獲取所有子節(jié)點(diǎn)信息以后盾沫,采用集合add()方法添加到總集合中,之后釋放對(duì)象內(nèi)存闯传,便于下一次循環(huán)時(shí)使用谨朝。
??
====》》》》 關(guān)于JDOM使用過(guò)程中JAR包的引用(導(dǎo)出)
①先在本project中創(chuàng)建一個(gè)folder文件,然后把jar包放在該folder里面
②然后再該project中buid path --->>>? configure build path中
③選擇右方的的Add JARS? 甥绿,選擇該jar包并ok
應(yīng)用DOM4J解析節(jié)點(diǎn)的屬性
====》》》》 如JDOM解析一樣導(dǎo)入相應(yīng)的jar包
====》》》》創(chuàng)建SAXReader的對(duì)象
====》》》》通過(guò)該對(duì)象的read()方法加載xml文件字币,并用Document獲取
====》》》》用Element的 .getRootElement()獲取根節(jié)點(diǎn)
====》》》》再對(duì)象 .elementIterator()獲取迭代器
??
====》》》》用while(it.hasNext())來(lái)進(jìn)行遍歷
====》》》》將it.next()轉(zhuǎn)換為Element類(lèi)型
====》》》》用集合來(lái)獲得節(jié)點(diǎn)屬性
====》》》》再用foreach輸出節(jié)點(diǎn)名和節(jié)點(diǎn)值
??
====》》》》用迭代器來(lái)接收屬性節(jié)點(diǎn)的子節(jié)點(diǎn)? .elementIterator()
====》》》》再用while(itt.hasNext())進(jìn)行遍歷
====》》》》再用Element強(qiáng)制轉(zhuǎn)換類(lèi)型
====》》》》輸出子節(jié)點(diǎn)名和子節(jié)點(diǎn)值
??
四種解析方式的分析
??
DOM解析
??
SAX解析
??
JDOM和DOM4J解析
??
XML文件寫(xiě)入
DOM寫(xiě)入
====》》》》創(chuàng)建一個(gè)類(lèi)便于獲得DocumentBuilder對(duì)象
??
====》》》》創(chuàng)建createXML()類(lèi)來(lái)新建XML文件的各個(gè)節(jié)點(diǎn)
??
====》》》》緊接著創(chuàng)建TransformerFactory對(duì)象? .newInstance()方法
====》》》》創(chuàng)建Transformer對(duì)象? .newTransformer()
====》》》》此對(duì)象調(diào)用transform()方法,new DOMSource(document)共缕,newStreamResult(new File(XML文件名))? ? 創(chuàng)建此XML文件
??
====》》》》讓XML文件中節(jié)點(diǎn)換行? 對(duì)象.setOutputProperty(OutputKeys.INDENT,"yes") 完成換行縮進(jìn)
??
====》》》》需要在創(chuàng)建節(jié)點(diǎn)前將standalone設(shè)置為true(設(shè)置后在XML文件中就不會(huì)顯示了)
====》》》》向book節(jié)點(diǎn)創(chuàng)建子節(jié)點(diǎn) 用 book.appendChild(name) 添加子節(jié)點(diǎn)
====》》》》設(shè)置子節(jié)點(diǎn)的文本內(nèi)容:? ? 子節(jié)點(diǎn).setTextContent(“文本內(nèi)容”)
??
SAX生成XML文件
====》》》》創(chuàng)建 ArrayList<>返回值類(lèi)型的parseXML()方法纬朝,用于創(chuàng)建對(duì)象
??
====》》》》創(chuàng)建createXML()方法,創(chuàng)建一個(gè)集合對(duì)象
??
====》》》》用 SAXTransformerFactory 創(chuàng)建對(duì)象tff
====》》》》再用TransformerHandler 創(chuàng)建 handler 對(duì)象 tff.newTransformerHandler()?
??
====》》》》通過(guò)handler對(duì)象 .getTransformer()? 創(chuàng)建一個(gè) Transformer對(duì)象
====》》》》通過(guò)該Transformer對(duì)象設(shè)置XML編碼和換行縮進(jìn)? ? tr.setOutputProperty(OutputKeys.屬性骄呼,“設(shè)置的值”)
??
在設(shè)置ENCODING和INDENT時(shí)要放在設(shè)置Result之前
====》》》》創(chuàng)建一個(gè)File對(duì)象? 再new StreamResult 為 Result對(duì)象
====》》》》在創(chuàng)建File文件時(shí)需要判斷共苛,如果f不存在則要?jiǎng)?chuàng)建這個(gè)文件
====》》》》將handler對(duì)象與Result對(duì)象關(guān)聯(lián)起來(lái)
??
====》》》》利用handler對(duì)象進(jìn)行XML文件的內(nèi)容編寫(xiě)
====》》》》先startDocument()開(kāi)始文本編輯
====》》》》用AttributesImple new 一個(gè) attribute對(duì)象
====》》》》再.startElement開(kāi)始加入標(biāo)簽,記得寫(xiě)完后要.endElement結(jié)束標(biāo)簽
====》》》》寫(xiě)完后關(guān)閉document
??
====》》》》向bookstore里面添加屬性內(nèi)容蜓萄,用過(guò)addAttribute添加? ? 要開(kāi)始和結(jié)束該標(biāo)簽
??
====》》》》生成文本子節(jié)點(diǎn)隅茎,用foreach循環(huán)
====》》》》每添加不同的attr進(jìn)入不同的節(jié)點(diǎn)的時(shí)候要先 .clear()? 清空它的值
====》》》》然后用handler.characters來(lái)添加各個(gè)子節(jié)點(diǎn)屬性的值
??
??
====》》》》由于不同屬性下的子節(jié)點(diǎn)不同,所以增加每一個(gè)子節(jié)點(diǎn)判斷機(jī)制
??
RSS
簡(jiǎn)易信息聚合(也叫聚合內(nèi)容)是一種RSS基于XML標(biāo)準(zhǔn)嫉沽,在互聯(lián)網(wǎng)上被廣泛采用的內(nèi)容包裝和投遞協(xié)議辟犀。RSS(Really Simple Syndication)是一種描述和同步網(wǎng)站內(nèi)容的格式,是使用最廣泛的XML應(yīng)用绸硕。
RSS目前廣泛用于網(wǎng)上新聞?lì)l道堂竟,blog和wiki,主要的版本有0.91, 1.0, 2.0玻佩。使用RSS訂閱能更快地獲取信息出嘹,網(wǎng)站提供RSS輸出,有利于讓用戶獲取網(wǎng)站內(nèi)容的最新更新咬崔。
??
利用DOM4j實(shí)現(xiàn)寫(xiě)入RSS的xml文件
??
====》》》》需要?jiǎng)?chuàng)建文件
??
====》》》》用Element創(chuàng)建子節(jié)點(diǎn)? addElement()添加
====》》》》用.setText()設(shè)置子節(jié)點(diǎn)文本內(nèi)容
====》》》》用OutputFormat.createPrettyPrint()設(shè)置文本的完美格式? 將對(duì)象插入到writer中
??
=====》》》》可以在OutputFormat對(duì)象中設(shè)置編碼格式
??
====》》》》關(guān)于轉(zhuǎn)義字符税稼,? .setEscapeText()? false? 就不會(huì)自動(dòng)轉(zhuǎn)義了烦秩,可以直接添加‘<’ '>'一類(lèi)字符了
??
用JDOM生成XML根節(jié)點(diǎn)
====》》》》先Element一個(gè)根節(jié)點(diǎn)
====》》》》.setAttribute 為節(jié)點(diǎn)添加屬性
====》》》》Document一個(gè)對(duì)象,XMLOutputter一個(gè)XML輸出對(duì)象
??
====》》》》.output()輸出document對(duì)象和創(chuàng)建的文件對(duì)象
??
====》》》》添加子節(jié)點(diǎn)和子節(jié)點(diǎn)內(nèi)容
??
====》》》》同樣的郎仆,想要設(shè)置格式? 用Format? 的? .getCompactFormat()創(chuàng)建格式化對(duì)象
====》》》》用format對(duì)象設(shè)置想要格式化的內(nèi)容? 例如縮進(jìn):format.setIndent("")
??
生成XML四種方式的對(duì)比
??