xml 名称中不能包含= 字符_可扩展标记语言:XML
XML技術(shù)(DOM、SAX解析XML)
1 掌握XML基本語法,命名規(guī)則
2 掌握什么是Schema,什么是DTD
3 掌握DOM解析XML
4 掌握SAX解析XML
5 掌握J(rèn)DOM解析XML
6 掌握DOM4J解析XML
首先來寫第一個簡單的XML文檔
以XML保存,打開瀏覽器,把文檔拉到地址欄。如果出現(xiàn)這種情況證明你的XML書寫是正確的。
1. XML(EXtensible Markup Language)概念和體系
(1) XML的特點(diǎn):
XML的作用:數(shù)據(jù)存儲和數(shù)據(jù)傳輸。XML的特點(diǎn):數(shù)據(jù)以純文本格式存儲、實(shí)現(xiàn)不同應(yīng)用程序之間的數(shù)據(jù)通信、實(shí)現(xiàn)不同平臺間的數(shù)據(jù)通信、實(shí)現(xiàn)不同平臺間的數(shù)據(jù)共享、使用XML將不同的程序不同的平臺之間聯(lián)系起來。
(2) 一個標(biāo)準(zhǔn)的XML文檔由什么組成?
必須要有文檔的聲明,根元素(一個文檔只能有一個根元素),根元素的子元素,文本(在xml中文本都是字符型)。
就剛剛寫的book文檔而言,books是book的父元素,book是books的子元素,XML的結(jié)構(gòu)如下,這是一顆倒掛著的樹:
2. XML基本語法:
① 有且只有一個根元素
② XML文檔聲明必須放在文檔的第一行
③ XML的標(biāo)簽必須成對出現(xiàn)
④ XML的標(biāo)簽嚴(yán)格區(qū)分小寫
⑤ XML必須正確嵌套
⑥ XML中屬性值必須加引號
⑦ XML中,一些特殊字符需要使用“實(shí)體”
⑧ XML中可以應(yīng)用適當(dāng)?shù)淖⑨?/p>
XML的命名規(guī)則:
名稱可以包含字母,數(shù)字以及其他字符。
名稱不能以數(shù)字或標(biāo)點(diǎn)符號開始,名稱不能包含空格。
3. Schema技術(shù):
(1) 什么是DTD驗(yàn)證及DTD驗(yàn)證的局限性?
DTD文檔類型定義,驗(yàn)證是否是“有效”的XML。
使用DTD的局限性:DTD不遵守XML語法、DTD數(shù)據(jù)類型有限、DTD不可擴(kuò)展、不支持命名空間。
(2) 什么Schema技術(shù)?
Schema是DTD的代替者,名稱為 XML Schema ,用于描述XML文檔結(jié)構(gòu),比DTD強(qiáng)大,最主要的特征之一就是XML Schema 支持?jǐn)?shù)據(jù)類型。
① Schema是用XML驗(yàn)證XML遵循XML的語法。
② Schema可以用作處理XML文檔的工具處理。
③ Schema大大擴(kuò)充了數(shù)據(jù)類型,而且還可以自定義數(shù)據(jù)類型。
④ Schema支持元素的繼承
4. DOM方式解析XML數(shù)據(jù)
(1) 解析XML文件的方式有哪些:
① DOM解析(官方提供)
② SAX解析(官方提供)
③ JDOM解析(第三方提供)
④ DOM4J解析(第三方提供)
(2) DOM解析XML的步驟:
① 創(chuàng)建一個DocumentBuilderFactory的對象
② 創(chuàng)建一個DocumentBuilder對象
③ 通過該DocumentBuilder的parse方法的都Document對象
④ 通過getElementsByTagName(...)方法獲取到節(jié)點(diǎn)的列表
⑤ 通過for循環(huán)遍歷每一個節(jié)點(diǎn)
⑥ 得到每個節(jié)點(diǎn)的屬性與屬性值
⑦ 得到每個節(jié)點(diǎn)的節(jié)點(diǎn)名與節(jié)點(diǎn)值
>>>使用DOM解析XML文檔(把XML中的數(shù)據(jù)讀取到Java程序中)使用之前的book文檔Java程序:package XML;import java.io.IOException;import javax.xml.parsers.DocumentBuilder; import javax.xml.parsers.DocumentBuilderFactory; import javax.xml.parsers.ParserConfigurationException;import org.w3c.dom.Document; import org.w3c.dom.NamedNodeMap; import org.w3c.dom.Node; import org.w3c.dom.NodeList; import org.xml.sax.SAXException;public class TestDOMParse {public static void main(String[] args) throws ParserConfigurationException, SAXException, IOException {//創(chuàng)建一個DocumentBuilderFactory的對象DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();//創(chuàng)建一個DocumentBuilder對象DocumentBuilder db = dbf.newDocumentBuilder();//通過DocumentBuilder的parse方法的到Document對象Document doc = db.parse("book.xml"); //通過getElementsByTagName方法獲取節(jié)點(diǎn)的列表NodeList bookList = doc.getElementsByTagName("book");//通過for循環(huán)遍歷每一個節(jié)點(diǎn)for(int i=0;i<bookList.getLength();i++) {//得到每一個屬性與屬相值Node book = bookList.item(i);NamedNodeMap attrs = book.getAttributes();//循環(huán)遍歷每一個屬性for(int j=0;j<attrs.getLength();j++) {//獲得每一個屬性Node id = attrs.item(j);System.out.println("屬性的名稱"+id.getNodeName()+"t"+id.getNodeValue()); } }System.out.println("n每個節(jié)點(diǎn)的名和節(jié)點(diǎn)值");//得到每一個節(jié)點(diǎn)與節(jié)點(diǎn)值for(int i=0;i<bookList.getLength();i++) {//得到每個節(jié)點(diǎn)book節(jié)點(diǎn)Node book = bookList.item(i);NodeList subNode = book.getChildNodes();System.out.println("子節(jié)點(diǎn)的個數(shù):"+subNode.getLength());//使用for循環(huán)遍歷每一book的子節(jié)點(diǎn)for(int j=0;j<subNode.getLength();j++) {Node childNode = subNode.item(j); // System.out.println(childNode.getNodeName());short type = childNode.getNodeType();//獲取節(jié)點(diǎn)的類型if (type==Node.ELEMENT_NODE) {System.out.println("節(jié)點(diǎn)的名稱:t"+childNode.getNodeName()+"t"+childNode.getTextContent());}}}} }運(yùn)行之后得到的結(jié)果是醬紫的:這時候已經(jīng)將XML文檔中的數(shù)據(jù)讀取出來了5. SAX方式解析XML數(shù)據(jù)
(1) SAX解析方式:
SAX(Simple API for XML),是一種以事件驅(qū)動的XML API,SAX與DOM不同的是它邊掃描邊解析,
自頂向下依次解析,由于邊掃描邊解析,所以它解析XML具有速度快,占用內(nèi)存少的優(yōu)點(diǎn)。
(2) SAX解析XML的步驟:
① 創(chuàng)建SAXParserFactory的對象
② 創(chuàng)建SAXParser對象(解析器)
③ 創(chuàng)建一個DefaultHandler的子類
④ 調(diào)用parse方法
老規(guī)矩,實(shí)操一下。創(chuàng)建一個子類BookDeaultHandler繼承DefaultHandler(org.xml.sax.helpers.DefaultHandler;)是這個包下的DefaultHandlerpackage XML;import org.xml.sax.Attributes; import org.xml.sax.SAXException; import org.xml.sax.helpers.DefaultHandler;public class BookDeaultHandler extends DefaultHandler {//重寫第一個方法/*解析xml文檔開始時調(diào)用*/@Overridepublic void startDocument() throws SAXException {super.startDocument();System.out.println("------解析xml文檔開始--------");}/*解析xml文檔結(jié)束時調(diào)用*/@Overridepublic void endDocument() throws SAXException {super.endDocument();System.out.println("------解析xml文檔結(jié)束--------");}/**解析xml文檔中的節(jié)點(diǎn)時調(diào)用*/@Overridepublic void startElement(String uri, String localName, String qName,Attributes attributes) throws SAXException {super.startElement(uri, localName, qName, attributes);/**判斷如果是book節(jié)點(diǎn),獲取節(jié)點(diǎn)的屬性與屬性值*/if("book".equals(qName)) {//獲取所有的屬性int count = attributes.getLength();//屬性的個數(shù)//循環(huán)獲取每個屬性for(int i=0; i<count;i++) {String attName = attributes.getQName(i);//屬性名稱String attValue = attributes.getValue(i);System.out.println("屬性名稱:"+attName+"t屬性值:"+attValue);}}else if(!"books".equals(qName)&&!"book".equals(qName)) {System.out.print("節(jié)點(diǎn)的名稱:t "+qName+"t");}}/**解析xml文檔中的節(jié)點(diǎn)結(jié)束調(diào)用*/@Overridepublic void endElement(String uri, String localName, String qName) throws SAXException {super.endElement(uri, localName, qName);}@Overridepublic void characters(char[] ch, int start, int length) throws SAXException {super.characters(ch, start, length);String value = new String(ch,start,length);if(!"".equals(value.trim())) {System.out.println(value);}} }主程序:package XML;import java.io.IOException;import javax.xml.parsers.ParserConfigurationException; import javax.xml.parsers.SAXParser; import javax.xml.parsers.SAXParserFactory;import org.xml.sax.SAXException;public class TestSAXParse {public static void main(String[] args) throws ParserConfigurationException, SAXException, IOException {//創(chuàng)建SAXParserFactory的對象SAXParserFactory spf = SAXParserFactory.newInstance();//創(chuàng)建SAXParser對象(解析器)SAXParser parser = spf.newSAXParser();//創(chuàng)建一個DefaultHandler的子類BookDeaultHandler bdh = new BookDeaultHandler();//調(diào)用parse方法parser.parse("book.xml",bdh);} }運(yùn)行結(jié)果是這樣子的:6. JDOM解析XML數(shù)據(jù)
(1) 簡述什么是JDOM?
是一種解析xml的Java工具包,它基于樹型結(jié)構(gòu),利用純Java的技術(shù)對xml文檔實(shí)現(xiàn)解析。
(2) JDOM解析XML的步驟?
① 創(chuàng)建一個SAXBuilder對象
② 調(diào)用build方法,得到Document對象(通過IO流)
③ 獲取根節(jié)點(diǎn)
④ 獲取根節(jié)點(diǎn)節(jié)點(diǎn)的直接子節(jié)點(diǎn)的集合
⑤ 遍歷集合
7. DOM4J解析XML數(shù)據(jù)
(1) 簡述DOM4J技術(shù) ?
是一個Java的XML API,是JDOM的升級品,用來讀寫XML文件。
(2) 四種解析XML技術(shù)的特點(diǎn):
① DOM解析:形成了樹結(jié)構(gòu),有助于更好的理解、掌握,且代碼容易編寫,解析過程中,樹結(jié)構(gòu)保存在內(nèi)存中,方便修改。
② SAX解析:采用事件驅(qū)動模式,對內(nèi)存消耗比較小適用于只處理XML文件中的數(shù)據(jù)。
③ JDOM解析:僅使用具體類,而不使用接口,API大量使用了Collection類。
④ DOM4J解析:是JDOM的一種智能分支,他合并了許多超出基本XML文檔表示的功能。它使用接口和抽象基本類方法。具有性能優(yōu)異、靈活性好、功能強(qiáng)大和極端易用的特點(diǎn)。是一個開放源碼的文件。
總結(jié)
以上是生活随笔為你收集整理的xml 名称中不能包含= 字符_可扩展标记语言:XML的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: numpy pytorch 接口对应_拆
- 下一篇: postman发送object_.Net