XML格式文件詳解
1
●
概述
XML,即可擴(kuò)展標(biāo)記語(yǔ)言,XML是互聯(lián)網(wǎng)數(shù)據(jù)傳輸?shù)闹匾ぞ?,它可以跨越互?lián)網(wǎng)任何的平臺(tái),不受編程語(yǔ)言和操作系統(tǒng)的限制,可以說(shuō)它是一個(gè)擁有互聯(lián)網(wǎng)最高級(jí)別通行證的數(shù)據(jù)攜帶者。XML是當(dāng)前處理結(jié)構(gòu)化文檔信息中相當(dāng)給力的技術(shù),XML有助于在服務(wù)器之間穿梭結(jié)構(gòu)化數(shù)據(jù),使得開(kāi)發(fā)人員更加得心應(yīng)手的控制數(shù)據(jù)的存儲(chǔ)和傳輸。XML用于標(biāo)記電子文件使其具有結(jié)構(gòu)性的標(biāo)記語(yǔ)言,可以用來(lái)標(biāo)記數(shù)據(jù)、定義數(shù)據(jù)類(lèi)型,是一種允許用戶(hù)對(duì)自己的標(biāo)記語(yǔ)言進(jìn)行定義的源語(yǔ)言。XML是標(biāo)準(zhǔn)通用標(biāo)記語(yǔ)言的子集,非常適合Web傳輸。XML提供統(tǒng)一的方法來(lái)描述和交換獨(dú)立于應(yīng)用程序或供應(yīng)商的結(jié)構(gòu)化數(shù)據(jù)。
一個(gè)XML格式文件必須要有第一行的聲明和它的文檔元素的描述信息。
2
●
XML的特點(diǎn)
XML與操作系統(tǒng)、編程語(yǔ)言的開(kāi)發(fā)平臺(tái)都無(wú)關(guān);
實(shí)現(xiàn)不同系統(tǒng)之間的數(shù)據(jù)交互。
3
●
XML的作用
配置應(yīng)用程序和網(wǎng)站;在配置文件里邊所有的配置文件都是以XML的格式來(lái)編寫(xiě)的。
數(shù)據(jù)交互;跨平臺(tái)進(jìn)行數(shù)據(jù)交互,它可以跨操作系統(tǒng),也可以跨編程語(yǔ)言的平臺(tái)。
4
●
XML聲明
XML聲明一般是XML文檔的第一行;
version屬性 :用于說(shuō)明當(dāng)前XML文檔的版本,因?yàn)槎际窃谟?.0,所以這個(gè)屬性值大家都寫(xiě)1.0,version屬性是必須的;
encoding屬性 :用于說(shuō)明當(dāng)前XML文檔使用的字符編碼集,XML解析器會(huì)使用這個(gè)編碼來(lái)解析XML文檔。encoding屬性是可選的,默認(rèn)為UTF-8。注意,如果當(dāng)前XML文檔使用的字符編碼集是GB2312,而encoding屬性的值為UTF-8,那么一定會(huì)出錯(cuò)的;
standalone屬性 :用于說(shuō)明當(dāng)前XML文檔是否為獨(dú)立文檔,如果該屬性值為yes,表示當(dāng)前XML文檔是獨(dú)立的,如果為no表示當(dāng)前XML文檔不是獨(dú)立的,即依賴(lài)外部的約束文件。默認(rèn)是yes
沒(méi)有XML文檔聲明的XML文檔,不是格式良好的XML文檔;
XML文檔聲明必須從XML文檔的1行1列開(kāi)始。
5
●
XML元素
XML元素的格式1
XML元素包含:開(kāi)始標(biāo)簽、元素體(內(nèi)容)、結(jié)束標(biāo)簽。
例如:大家好
空元素:空元素只有開(kāi)始標(biāo)簽,沒(méi)有元素體和結(jié)束標(biāo)簽,但空元素一定要閉合。
例如:
XML元素的格式2
XML元素可以包含子元素或文本數(shù)據(jù)。
hello
a元素的元素體內(nèi)容是b元素,而b元素的元素體內(nèi)容是文本數(shù)據(jù)hello。
XML元素可以嵌套,但必須是合法嵌套。
例如:hello
[
就是錯(cuò)誤的嵌套。
XML文檔的根元素
格式良好的XML文檔必須且僅有一個(gè)根元素!它是XML文檔里面唯一的;它的開(kāi)始是放在最前面,結(jié)束是放在最后面。
(1) 所有的XML元素都必須有結(jié)束標(biāo)簽;
(2) XML標(biāo)簽對(duì)大小寫(xiě)敏感;
(3) XML必須正確地嵌套;
(4) 元素的命名規(guī)則:
名稱(chēng)中可以包含字母、數(shù)字或者其他的字符;
名稱(chēng)不能以數(shù)字或者標(biāo)點(diǎn)符號(hào)開(kāi)始;
名稱(chēng)中不能包含空格。
(5) 空元素
元素命名規(guī)范
XML元素名可以包含字母、數(shù)字以及一些其它可見(jiàn)字符,但必須遵循下面的一些規(guī)范:
區(qū)分大小寫(xiě);
不能以數(shù)字開(kāi)頭:<1a>都是錯(cuò)誤的;
最好不要以XML開(kāi)頭;
不能包含空格;
元素屬性
屬性由屬性名與屬性值構(gòu)成,中間用等號(hào)連接;
屬性值必須使用引號(hào)括起來(lái),單引或雙引;
定義屬性必須遵循與標(biāo)簽名相同的命名規(guī)范;
屬性必須定義在元素的開(kāi)始標(biāo)簽中;
一個(gè)元素中不能包含相同的屬性名;
語(yǔ)法,<元素名 屬性名=“屬性值”/>
注釋
注釋內(nèi)容中不要出現(xiàn)”--”;
不要把注釋放在標(biāo)簽中間;
注釋不能嵌套。
"1.0" encoding="UTF-8"?>"1">Thinking in Java (4th Edition)Bruce Eckel200775.60"2">Introduction to AlgorithmsThomas H.Cormen201289.60
XML格式文件解析方法
1
●
DOM
基于DOM解析的XML分析器是將其轉(zhuǎn)換為一個(gè)對(duì)象模型的集合,用樹(shù)這種數(shù)據(jù)結(jié)構(gòu)對(duì)信息進(jìn)行儲(chǔ)存。通過(guò)DOM接口,應(yīng)用程序可以在任何時(shí)候訪問(wèn)XML文檔中的任何一部分?jǐn)?shù)據(jù),因此這種利用DOM接口訪問(wèn)的方式也被稱(chēng)為隨機(jī)訪問(wèn)。這種方式也有缺陷,因?yàn)镈OM分析器將整個(gè)XML文件轉(zhuǎn)換為了樹(shù)存放在內(nèi)存中,當(dāng)文件結(jié)構(gòu)較大或者數(shù)據(jù)較復(fù)雜的時(shí)候,這種方式對(duì)內(nèi)存的要求就比較高,且對(duì)于結(jié)構(gòu)復(fù)雜的樹(shù)進(jìn)行遍歷也是一種非常耗時(shí)的操作。不過(guò)DOM所采用的樹(shù)結(jié)構(gòu)與XML存儲(chǔ)信息的方式相吻合,同時(shí)其隨機(jī)訪問(wèn)還可利用,所以DOM接口還是具有廣泛的使用價(jià)值。
**優(yōu)點(diǎn)** :
形成了樹(shù)結(jié)構(gòu),直觀好理解,代碼容易編寫(xiě);
解析過(guò)程中樹(shù)結(jié)構(gòu)保存在內(nèi)存中,方便修改。
**缺點(diǎn)** :
當(dāng)XML文件較大時(shí),對(duì)內(nèi)存耗費(fèi)比較大,容易影響解析性能并造成內(nèi)存溢出。
**核心代碼**
//Element方式public static void element(NodeList list){for (int i = 0; i <list.getLength() ; i++) {Element element = (Element) list.item(i);NodeList childNodes = element.getChildNodes();for (int j = 0; j ()>if (childNodes.item(j).getNodeType()== Node.ELEMENT_NODE) {//獲取節(jié)點(diǎn)System.out.print(childNodes.item(j).getNodeName() + ":");//獲取節(jié)點(diǎn)值System.out.println(childNodes.item(j).getFirstChild().getNodeValue());}}}}public static void node(NodeList list){for (int i = 0; i <list.getLength() ; i++) {Node node = list.item(i);NodeList childNodes = node.getChildNodes();for (int j = 0; j ()>if (childNodes.item(j).getNodeType()==Node.ELEMENT_NODE) {System.out.print(childNodes.item(j).getNodeName() + ":");System.out.println(childNodes.item(j).getFirstChild().getNodeValue());}}}}public static void main(String[] args) {//1.創(chuàng)建DocumentBuilderFactory對(duì)象DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();//2.創(chuàng)建DocumentBuilder對(duì)象try {DocumentBuilder builder = factory.newDocumentBuilder();Document d = builder.parse("src/main/resources/Books.xml");NodeList sList = d.getElementsByTagName("book");//element(sList);node(sList);} catch (Exception e) {e.printStackTrace();}}
2
●
SAX
SAX是一種XML解析的替代方法。相比于文檔對(duì)象模型DOM,SAX 是讀取和操作 XML 數(shù)據(jù)的更快速、更輕量的方法。SAX 允許您在讀取文檔時(shí)處理它,從而不必等待整個(gè)文檔被存儲(chǔ)之后才采取操作。它不涉及 DOM 所必需的開(kāi)銷(xiāo)和概念跳躍。SAX API是一個(gè)基于事件的API ,適用于處理數(shù)據(jù)流,即隨著數(shù)據(jù)的流動(dòng)而依次處理數(shù)據(jù)。SAX API 在其解析您的文檔時(shí)發(fā)生一定事件的時(shí)候會(huì)通知您。在您對(duì)其響應(yīng)時(shí),您不作保存的數(shù)據(jù)將會(huì) 被拋棄。
**優(yōu)點(diǎn)** :
采用事件驅(qū)動(dòng)模式,對(duì)內(nèi)存耗費(fèi)比較??;
適用于只需要處理XML數(shù)據(jù)時(shí)。
缺點(diǎn):
不易編碼;
很難同時(shí)訪問(wèn)同一個(gè)XML中的多處數(shù)據(jù)。
**核心代碼**
public static void main(String[] args) throws Exception {//1.或去SAXParserFactory實(shí)例SAXParserFactory factory = SAXParserFactory.newInstance();//2.獲取SAXparser實(shí)例SAXParser saxParser = factory.newSAXParser();//創(chuàng)建Handel對(duì)象SAXDemoHandel handel = new SAXDemoHandel();saxParser.parse("src/main/resources/Books.xml",handel);}}class SAXDemoHandel extends DefaultHandler {//遍歷xml文件開(kāi)始標(biāo)簽@Overridepublic void startDocument() throws SAXException {super.startDocument();System.out.println("sax解析開(kāi)始");}//遍歷xml文件結(jié)束標(biāo)簽@Overridepublic void endDocument() throws SAXException {super.endDocument();System.out.println("sax解析結(jié)束");}@Overridepublic void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException {super.startElement(uri, localName, qName, attributes);if (qName.equals("book")){System.out.println("============開(kāi)始遍歷student=============");//System.out.println(attributes.getValue("rollno"));}else if (!qName.equals("book")&&!qName.equals("bookstore")){System.out.print("節(jié)點(diǎn)名稱(chēng):"+qName+"----");}}@Overridepublic void endElement(String uri, String localName, String qName) throws SAXException {super.endElement(uri, localName, qName);if (qName.equals("book")){System.out.println(qName+"遍歷結(jié)束");System.out.println("============結(jié)束遍歷student=============");}}@Overridepublic void characters(char[] ch, int start, int length) throws SAXException {super.characters(ch, start, length);String value = new String(ch,start,length).trim();if (!value.equals("")) {System.out.println(value);}}
3
●
JDOM
JDOM是一個(gè)開(kāi)源項(xiàng)目,基于樹(shù)型結(jié)構(gòu),利用純JAVA的技術(shù)對(duì)XML文檔實(shí)現(xiàn)解析、生成、序列化以及多種操作。
JDOM 直接為JAVA編程服務(wù)。它利用更為強(qiáng)有力的JAVA語(yǔ)言的諸多特性(方法重載、集合概念以及映射),把SAX和DOM的功能有效地結(jié)合起來(lái)。JDOM是用Java語(yǔ)言讀、寫(xiě)、操作XML的新API函數(shù)。在使用設(shè)計(jì)上盡可能地隱藏原來(lái)使用XML過(guò)程中的復(fù)雜性。
**優(yōu)缺點(diǎn)** :
僅使用具體類(lèi)而不使用具體接口;
API中大量使用了Collections類(lèi)。
**核心代碼**
public static void main(String[] args) throws Exception {//1.創(chuàng)建SAXBuilder對(duì)象SAXBuilder saxBuilder = new SAXBuilder();//2.創(chuàng)建輸入流InputStream is = new FileInputStream(new File("src/main/resources/Books.xml"));//3.將輸入流加載到build中Document document = saxBuilder.build(is);//4.獲取根節(jié)點(diǎn)Element rootElement = document.getRootElement();//5.獲取子節(jié)點(diǎn)List children = rootElement.getChildren();for (Element child : children) {System.out.println("通過(guò)rollno獲取屬性值:"+child.getAttribute("rollno"));List attributes = child.getAttributes();//打印屬性for (Attribute attr : attributes) {System.out.println(attr.getName()+":"+attr.getValue());}List childrenList = child.getChildren();System.out.println("======獲取子節(jié)點(diǎn)-start======");for (Element o : childrenList) {System.out.println("節(jié)點(diǎn)名:"+o.getName()+"---"+"節(jié)點(diǎn)值:"+o.getValue());}System.out.println("======獲取子節(jié)點(diǎn)-end======");}}
4
●
DOM4J
DOM4J是一個(gè)Java的XML API,類(lèi)似于JDOM,用來(lái)讀寫(xiě)XML文件的。DOM4J是一個(gè)非常非常優(yōu)秀的Java XML API,具有性能優(yōu)異、功能強(qiáng)大和極端易用使用的特點(diǎn),同時(shí)它也是一個(gè)開(kāi)放源代碼的軟件。對(duì)主流的Java XML API進(jìn)行的性能、功能和易用性的評(píng)測(cè),DOM4J無(wú)論在那個(gè)方面都是非常出色的。如今你可以看到越來(lái)越多的Java軟件都在使用DOM4J來(lái)讀寫(xiě)XML,例如Hibernate,包括sun公司自己的JAXM也用了Dom4j。
優(yōu)缺點(diǎn):
JDOM的一種智能分支,合并了許多超出基本XML文檔表示的功能;
使用接口和抽象基本類(lèi)方法,是一個(gè)優(yōu)秀的Java XML API;
具有性能優(yōu)異,靈活性好、功能強(qiáng)大和極端易使用的特點(diǎn);
目前使用較多。
**核心代碼**
public static void main(String[] args) throws Exception {//1.創(chuàng)建Reader對(duì)象SAXReader reader = new SAXReader();//2.加載xmlDocument document = reader.read(new File("src/main/resources/Books.xml"));//3.獲取根節(jié)點(diǎn)Element rootElement = document.getRootElement();Iterator iterator = rootElement.elementIterator();while (iterator.hasNext()){Element stu = (Element) iterator.next();List attributes = stu.attributes();System.out.println("======獲取屬性值======");for (Attribute attribute : attributes) {System.out.println(attribute.getValue());}System.out.println("======遍歷子節(jié)點(diǎn)======");Iterator iterator1 = stu.elementIterator();while (iterator1.hasNext()){Element stuChild = (Element) iterator1.next();System.out.println("節(jié)點(diǎn)名:"+stuChild.getName()+"---節(jié)點(diǎn)值:"+stuChild.getStringValue());}}}
說(shuō)明
源碼中采用了兩種實(shí)現(xiàn)方式解析XML格式文件內(nèi)容: 直接讀取 和 借助類(lèi)讀取 ,但原理相同
源碼獲取
關(guān)注微信公眾號(hào):
Java爛筆頭
對(duì)話框回復(fù):
XML
]()
-
數(shù)據(jù)傳輸
+關(guān)注
關(guān)注
9文章
2230瀏覽量
67750 -
互聯(lián)網(wǎng)
+關(guān)注
關(guān)注
55文章
11350瀏覽量
110489 -
XML
+關(guān)注
關(guān)注
0文章
190瀏覽量
34587
發(fā)布評(píng)論請(qǐng)先 登錄
怎樣打開(kāi)pdg格式文件-pdg格式文件打開(kāi)軟件
CAD看圖軟件將DWG格式文件轉(zhuǎn)換為JPG格式文件的方法教程
XML格式文件出現(xiàn)嚴(yán)重的java.lang.N.N錯(cuò)誤日志無(wú)法正常顯示預(yù)覽怎么處理?
DWG格式文件查看器
orcad轉(zhuǎn)pads格式文件的技術(shù)及實(shí)現(xiàn)方法
DjVu/TIFF格式文件(文檔)打開(kāi)軟件工具
康佳F2587E_G(24C04)格式文件EPROM數(shù)據(jù)
tif格式文件用什么打開(kāi)(如何打開(kāi)怎么打開(kāi)) tif是什么格
如何打開(kāi)eip文件,eip格式文件怎么打開(kāi)
CAD用到的各種格式文件 你都知道嗎?
紫金橋軟件讀寫(xiě)XML文件的方法
XML格式文件詳解
評(píng)論