1、什么是XML蒲障?
- 表現(xiàn):以".xml"為文件擴(kuò)展名的文件
- 存儲:樹形結(jié)構(gòu)
xml.png
<?xml version="1.0" encoding="UTF-8"?>
<bookstore>
<book id="1">
<name>冰與火之歌</name>
<author>喬治馬丁</author>
<year>2014</year>
<price>89</price>
</book>
<book id="2">
<name>安徒生童話</name>
<author>2004</author>
<price>77</price>
<language>English</language>
</book>
</bookstore>
2歹篓、在Java程序中如何獲取xml文件的內(nèi)容
- 四種解析方式:
- DOM(JDK官方提供、不依賴第三方j(luò)ar包)
- SAX(JDK官方提供揉阎、不依賴第三方j(luò)ar包)
- DOM4J(非JDK官方提供庄撮、依賴第三方j(luò)ar包)
- JDOM(非JDK官方提供、依賴第三方j(luò)ar包)
3毙籽、代碼示例(DOM方式)
package com.lord.quick;
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 DOMTest {
public static void main(String[] args) {
// 創(chuàng)建一個DocumentBuilderFactory的對象
DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
// 創(chuàng)建一個DocumentBuilder的對象
try {
// 創(chuàng)建DocumentBuilder對象
DocumentBuilder db = dbf.newDocumentBuilder();
// 通過DocumentBuilder對象的parser方法加載books.xml文件到當(dāng)前項目下
Document document = db.parse("books.xml");
// 獲取所有book節(jié)點的集合
NodeList bookList = document.getElementsByTagName("book");
// 通過nodelist的getLength()方法可以獲取bookList的長度
System.out.println("一共有" + bookList.getLength() + "本書");
// 遍歷每一個book節(jié)點
for (int i = 0; i < bookList.getLength(); i++) {
System.out.println("====下面開始遍歷第" + (i + 1) + "本書的內(nèi)容====");
// 通過 item(i)方法 獲取一個book節(jié)點重窟,nodelist的索引值從0開始
Node book = bookList.item(i);
// 獲取book節(jié)點的所有屬性集合
NamedNodeMap attrs = book.getAttributes();
System.out.println("第 " + (i + 1) + "本書共有" + attrs.getLength() + "個屬性");
// 遍歷book的屬性
for (int j = 0; j < attrs.getLength(); j++) {
// 通過item(index)方法獲取book節(jié)點的某一個屬性
Node attr = attrs.item(j);
// 獲取屬性名
System.out.print("屬性名:" + attr.getNodeName());
// 獲取屬性值
System.out.println("--屬性值" + attr.getNodeValue());
}
// //前提:已經(jīng)知道book節(jié)點有且只能有1個id屬性
// //將book節(jié)點進(jìn)行強(qiáng)制類型轉(zhuǎn)換,轉(zhuǎn)換成Element類型
// Element book = (Element) bookList.item(i);
// //通過getAttribute("id")方法獲取屬性值
// String attrValue = book.getAttribute("id");
// System.out.println("id屬性的屬性值為" + attrValue);
// 解析book節(jié)點的子節(jié)點
NodeList childNodes = book.getChildNodes();
// 遍歷childNodes獲取每個節(jié)點的節(jié)點名和節(jié)點值
System.out.println("第" + (i + 1) + "本書共有" + childNodes.getLength() + "個子節(jié)點");
for (int k = 0; k < childNodes.getLength(); k++) {
// 區(qū)分出text類型的node以及element類型的node
if (childNodes.item(k).getNodeType() == Node.ELEMENT_NODE) {
// 獲取了element類型節(jié)點的節(jié)點名
System.out.print("第" + (k + 1) + "個節(jié)點的節(jié)點名:" + childNodes.item(k).getNodeName());
// 獲取了element類型節(jié)點的節(jié)點值
System.out.println("--節(jié)點值是:" + childNodes.item(k).getFirstChild().getNodeValue());
// System.out.println("--節(jié)點值是:" + childNodes.item(k).getTextContent());
}
}
System.out.println("====結(jié)束遍歷第" + (i + 1) + "本書的內(nèi)容====");
}
} catch (ParserConfigurationException e) {
e.printStackTrace();
} catch (SAXException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
}
4、代碼示例(DOM4J方式)
package com.lord.quick;
import java.awt.print.Book;
import java.io.File;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import org.dom4j.Attribute;
import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.Element;
import org.dom4j.io.SAXReader;
public class DOM4JTest {
private static ArrayList<Book> bookList = new ArrayList<Book>();
/**
* @param args
*/
public static void main(String[] args) {
// 解析books.xml文件
// 創(chuàng)建SAXReader的對象reader
SAXReader reader = new SAXReader();
try {
// 通過reader對象的read方法加載books.xml文件,獲取docuemnt對象偎漫。
Document document = reader.read(new File("D://books.xml"));
// 通過document對象獲取根節(jié)點bookstore
Element bookStore = document.getRootElement();
// 通過element對象的elementIterator方法獲取迭代器
Iterator it = bookStore.elementIterator();
// 遍歷迭代器浇冰,獲取根節(jié)點中的信息(書籍)
while (it.hasNext()) {
System.out.println("=====開始遍歷某一本書=====");
Element book = (Element) it.next();
// 獲取book的屬性名以及 屬性值
List<Attribute> bookAttrs = book.attributes();
for (Attribute attr : bookAttrs) {
System.out.println("屬性名:" + attr.getName() + "--屬性值:" + attr.getValue());
}
Iterator itt = book.elementIterator();
while (itt.hasNext()) {
Element bookChild = (Element) itt.next();
System.out.println("節(jié)點名:" + bookChild.getName() + "--節(jié)點值:" + bookChild.getStringValue());
}
System.out.println("=====結(jié)束遍歷某一本書=====");
}
} catch (DocumentException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
5忿磅、DOM4J的特點
- JDOM的一種智能分支玄渗,它合并了許多超出基本XML文檔表示的功能
- 具有性能優(yōu)異俱尼、靈活性好矮台、功能強(qiáng)大和極易使用的特點
- 是一個開放源代碼的軟件