XML格式文件詳解
1
●
概述
XML,即可擴展標記語言,XML是互聯網數據傳輸的重要工具,它可以跨越互聯網任何的平臺,不受編程語言和操作系統的限制,可以說它是一個擁有互聯網最高級別通行證的數據攜帶者。XML是當前處理結構化文檔信息中相當給力的技術,XML有助于在服務器之間穿梭結構化數據,使得開發人員更加得心應手的控制數據的存儲和傳輸。XML用于標記電子文件使其具有結構性的標記語言,可以用來標記數據、定義數據類型,是一種允許用戶對自己的標記語言進行定義的源語言。XML是標準通用標記語言的子集,非常適合Web傳輸。XML提供統一的方法來描述和交換獨立于應用程序或供應商的結構化數據。
一個XML格式文件必須要有第一行的聲明和它的文檔元素的描述信息。
2
●
XML的特點
XML與操作系統、編程語言的開發平臺都無關;
實現不同系統之間的數據交互。
3
●
XML的作用
配置應用程序和網站;在配置文件里邊所有的配置文件都是以XML的格式來編寫的。
數據交互;跨平臺進行數據交互,它可以跨操作系統,也可以跨編程語言的平臺。
4
●
XML聲明
XML聲明一般是XML文檔的第一行;
version屬性 :用于說明當前XML文檔的版本,因為都是在用1.0,所以這個屬性值大家都寫1.0,version屬性是必須的;
encoding屬性 :用于說明當前XML文檔使用的字符編碼集,XML解析器會使用這個編碼來解析XML文檔。encoding屬性是可選的,默認為UTF-8。注意,如果當前XML文檔使用的字符編碼集是GB2312,而encoding屬性的值為UTF-8,那么一定會出錯的;
standalone屬性 :用于說明當前XML文檔是否為獨立文檔,如果該屬性值為yes,表示當前XML文檔是獨立的,如果為no表示當前XML文檔不是獨立的,即依賴外部的約束文件。默認是yes
沒有XML文檔聲明的XML文檔,不是格式良好的XML文檔;
XML文檔聲明必須從XML文檔的1行1列開始。
5
●
XML元素
XML元素的格式1
XML元素包含:開始標簽、元素體(內容)、結束標簽。
例如:大家好
空元素:空元素只有開始標簽,沒有元素體和結束標簽,但空元素一定要閉合。
例如:
XML元素的格式2
XML元素可以包含子元素或文本數據。
hello
a元素的元素體內容是b元素,而b元素的元素體內容是文本數據hello。
XML元素可以嵌套,但必須是合法嵌套。
例如:hello
[
就是錯誤的嵌套。
XML文檔的根元素
格式良好的XML文檔必須且僅有一個根元素!它是XML文檔里面唯一的;它的開始是放在最前面,結束是放在最后面。
(1) 所有的XML元素都必須有結束標簽;
(2) XML標簽對大小寫敏感;
(3) XML必須正確地嵌套;
(4) 元素的命名規則:
名稱中可以包含字母、數字或者其他的字符;
名稱不能以數字或者標點符號開始;
名稱中不能包含空格。
(5) 空元素
元素命名規范
XML元素名可以包含字母、數字以及一些其它可見字符,但必須遵循下面的一些規范:
區分大小寫;
不能以數字開頭:<1a>都是錯誤的;
最好不要以XML開頭;
不能包含空格;
元素屬性
屬性由屬性名與屬性值構成,中間用等號連接;
屬性值必須使用引號括起來,單引或雙引;
定義屬性必須遵循與標簽名相同的命名規范;
屬性必須定義在元素的開始標簽中;
一個元素中不能包含相同的屬性名;
語法,<元素名 屬性名=“屬性值”/>
注釋
注釋內容中不要出現”--”;
不要把注釋放在標簽中間;
注釋不能嵌套。
"1.0" encoding="UTF-8"?>
"1">
Thinking in Java (4th Edition)
Bruce Eckel
2007
75.60
"2">
Introduction to Algorithms
Thomas H.Cormen
2012
89.60
XML格式文件解析方法
1
●
DOM
基于DOM解析的XML分析器是將其轉換為一個對象模型的集合,用樹這種數據結構對信息進行儲存。通過DOM接口,應用程序可以在任何時候訪問XML文檔中的任何一部分數據,因此這種利用DOM接口訪問的方式也被稱為隨機訪問。這種方式也有缺陷,因為DOM分析器將整個XML文件轉換為了樹存放在內存中,當文件結構較大或者數據較復雜的時候,這種方式對內存的要求就比較高,且對于結構復雜的樹進行遍歷也是一種非常耗時的操作。不過DOM所采用的樹結構與XML存儲信息的方式相吻合,同時其隨機訪問還可利用,所以DOM接口還是具有廣泛的使用價值。
**優點** :
形成了樹結構,直觀好理解,代碼容易編寫;
解析過程中樹結構保存在內存中,方便修改。
**缺點** :
當XML文件較大時,對內存耗費比較大,容易影響解析性能并造成內存溢出。
**核心代碼**
//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) {
//獲取節點
System.out.print(childNodes.item(j).getNodeName() + ":");
//獲取節點值
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.創建DocumentBuilderFactory對象
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
//2.創建DocumentBuilder對象
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解析的替代方法。相比于文檔對象模型DOM,SAX 是讀取和操作 XML 數據的更快速、更輕量的方法。SAX 允許您在讀取文檔時處理它,從而不必等待整個文檔被存儲之后才采取操作。它不涉及 DOM 所必需的開銷和概念跳躍。SAX API是一個基于事件的API ,適用于處理數據流,即隨著數據的流動而依次處理數據。SAX API 在其解析您的文檔時發生一定事件的時候會通知您。在您對其響應時,您不作保存的數據將會 被拋棄。
**優點** :
采用事件驅動模式,對內存耗費比較??;
適用于只需要處理XML數據時。
缺點:
不易編碼;
很難同時訪問同一個XML中的多處數據。
**核心代碼**
public static void main(String[] args) throws Exception {
//1.或去SAXParserFactory實例
SAXParserFactory factory = SAXParserFactory.newInstance();
//2.獲取SAXparser實例
SAXParser saxParser = factory.newSAXParser();
//創建Handel對象
SAXDemoHandel handel = new SAXDemoHandel();
saxParser.parse("src/main/resources/Books.xml",handel);
}
}
class SAXDemoHandel extends DefaultHandler {
//遍歷xml文件開始標簽
@Override
public void startDocument() throws SAXException {
super.startDocument();
System.out.println("sax解析開始");
}
//遍歷xml文件結束標簽
@Override
public void endDocument() throws SAXException {
super.endDocument();
System.out.println("sax解析結束");
}
@Override
public 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("============開始遍歷student=============");
//System.out.println(attributes.getValue("rollno"));
}
else if (!qName.equals("book")&&!qName.equals("bookstore")){
System.out.print("節點名稱:"+qName+"----");
}
}
@Override
public void endElement(String uri, String localName, String qName) throws SAXException {
super.endElement(uri, localName, qName);
if (qName.equals("book")){
System.out.println(qName+"遍歷結束");
System.out.println("============結束遍歷student=============");
}
}
@Override
public 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是一個開源項目,基于樹型結構,利用純JAVA的技術對XML文檔實現解析、生成、序列化以及多種操作。
JDOM 直接為JAVA編程服務。它利用更為強有力的JAVA語言的諸多特性(方法重載、集合概念以及映射),把SAX和DOM的功能有效地結合起來。JDOM是用Java語言讀、寫、操作XML的新API函數。在使用設計上盡可能地隱藏原來使用XML過程中的復雜性。
**優缺點** :
僅使用具體類而不使用具體接口;
API中大量使用了Collections類。
**核心代碼**
public static void main(String[] args) throws Exception {
//1.創建SAXBuilder對象
SAXBuilder saxBuilder = new SAXBuilder();
//2.創建輸入流
InputStream is = new FileInputStream(new File("src/main/resources/Books.xml"));
//3.將輸入流加載到build中
Document document = saxBuilder.build(is);
//4.獲取根節點
Element rootElement = document.getRootElement();
//5.獲取子節點
List children = rootElement.getChildren();
for (Element child : children) {
System.out.println("通過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("======獲取子節點-start======");
for (Element o : childrenList) {
System.out.println("節點名:"+o.getName()+"---"+"節點值:"+o.getValue());
}
System.out.println("======獲取子節點-end======");
}
}
4
●
DOM4J
DOM4J是一個Java的XML API,類似于JDOM,用來讀寫XML文件的。DOM4J是一個非常非常優秀的Java XML API,具有性能優異、功能強大和極端易用使用的特點,同時它也是一個開放源代碼的軟件。對主流的Java XML API進行的性能、功能和易用性的評測,DOM4J無論在那個方面都是非常出色的。如今你可以看到越來越多的Java軟件都在使用DOM4J來讀寫XML,例如Hibernate,包括sun公司自己的JAXM也用了Dom4j。
優缺點:
JDOM的一種智能分支,合并了許多超出基本XML文檔表示的功能;
使用接口和抽象基本類方法,是一個優秀的Java XML API;
具有性能優異,靈活性好、功能強大和極端易使用的特點;
目前使用較多。
**核心代碼**
public static void main(String[] args) throws Exception {
//1.創建Reader對象
SAXReader reader = new SAXReader();
//2.加載xml
Document document = reader.read(new File("src/main/resources/Books.xml"));
//3.獲取根節點
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("======遍歷子節點======");
Iterator iterator1 = stu.elementIterator();
while (iterator1.hasNext()){
Element stuChild = (Element) iterator1.next();
System.out.println("節點名:"+stuChild.getName()+"---節點值:"+stuChild.getStringValue());
}
}
}
說明
源碼中采用了兩種實現方式解析XML格式文件內容: 直接讀取 和 借助類讀取 ,但原理相同
源碼獲取
關注微信公眾號:
Java爛筆頭
對話框回復:
XML
]()
-
數據傳輸
+關注
關注
9文章
1880瀏覽量
64557 -
互聯網
+關注
關注
54文章
11148瀏覽量
103229 -
XML
+關注
關注
0文章
188瀏覽量
33077
發布評論請先 登錄
相關推薦
評論