-
XML解析方式:
DOM:(Document Object Model)文檔對象模型瑟蜈。
SAX:(Simple API for XML)這種方式屬于開源社區(qū)XML-DEV畸裳,幾乎所有的XML解析器都支持它
-
XML解析開發(fā)包
JAXP:(Java API for XML Processing)SUN公司的解析標準實現(xiàn)
Dom4J和JDom:是開源組織的解析開發(fā)包
-
JAXP JavaSE的一部分昏滴,它由以下幾個包及其子包組成:
org.w3c.dom:提供DOM方式解析XML的標準接口
org.xml.sax:提供SAX方式解析XML的標準接口
javax.xml:提供解析XML文檔的類
javax.xml.parsers:定義了工廠類秃嗜,通過調用這些工廠類惑申,獲取解析XML文檔的解析器對象DocumentBuilderFactory和SAXParserFactory
</br>
DocumentBuilderFactory是一個抽象工廠類岩睁,不能直接實例化,用于創(chuàng)建DOM模式的解析器對象 燥狰,調用其newInstance方法 棘脐,會自動創(chuàng)建工廠對象
DOM解析.png
DOM解析原理(document object model)
DOM解析器在解析XML文檔時,會把文檔中的所有元素龙致,按照其出現(xiàn)的層次關系蛀缝,解析成一個個Node對象(節(jié)點) ,節(jié)點之間關系可以用DOM樹描述
DOM樹.png
Node對象
- 節(jié)點類型:
父節(jié)點(parent) 子節(jié)點(children) 兄弟節(jié)點(sibling) 節(jié)點后代(descendant) 節(jié)點的祖先(ancestor)
- Node對象提供了一系列常量來代表結點的類型
當獲得某個Node類型后目代,就可以把Node節(jié)點轉換成相應的節(jié)點對象(Node的子類對象)屈梁,以便于調用其特有的方法
。 - Node對象提供了相應的方法去獲得它的父結點或子結點
通過這些方法就可以讀取整個XML文檔的內容像啼、或添加、修改潭苞、刪除XML文檔的內容了
DOM解析流程
獲取DOM解析器
調用 DocumentBuilderFactory.newInstance() 方法得到創(chuàng)建 DOM 解析器的工廠
調用工廠對象的 newDocumentBuilder方法得到 DOM 解析器對象
調用 DOM 解析器對象的 parse() 方法解析 XML 文檔忽冻,得到代表整個文檔的 Document 對象,進行可以利用DOM特性對整個XML文檔進行操作了
獲取文檔各節(jié)點內容或屬性
得到某個具體的節(jié)點內容
打印某節(jié)點的所有元素節(jié)點
修改某個元素節(jié)點的主體內容
向指定元素節(jié)點中增加子元素節(jié)點
向指定元素節(jié)點上增加同級元素節(jié)點
刪除指定元素節(jié)點
操作XML文件屬性
更新XML文檔
通過TransformerFactory獲得的Transformer類可以把代表XML文件的Document對象轉換為某種格式后進行輸出此疹,也可以把Document對象又重新寫入到一個XML文件中
通過transform方法完成轉換操作僧诚,該方法接收一個源和一個目的地
通過javax.xml.transform.dom.DOMSource類來關聯(lián)要轉換的document對象
用javax.xml.transform.stream.StreamResult 對象來表示數(shù)據(jù)的目的地
//jaxp dom解析的標準寫回流程
//
TransformerFactory tsf =TransformerFactory.newInstance();
Transformer tsTransformer = tsf.newTransformer();
tsTransformer.transform(new DOMSource(document), new StreamResult("src/books.xml"));
DOM編程測試
xml文檔代碼:
<?xml version="1.0" encoding="utf-8"?>
<書架>
<書>
<書名>浪潮之巔</書名>
<作者>吳軍</作者>
<售價>50</售價>
<個人信息><age>50</age></個人信息>
</書>
<書>
<書名>數(shù)學之美</書名>
<作者 title='ADS'>陸奇</作者>
<售價>29</售價>
<個人信息><age>40</age></個人信息>
</書>
</書架>
DOM解析代碼:
//為方便查看結構遮婶,聲明異常throws Exception
import java.io.File;
import java.io.FileInputStream;
import java.util.ArrayList;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.NodeList;
public class MyParser2
{
public static void main(String[] args) throws Exception
{
//定義集合用于接收BOOk類
ArrayList<Book> booklist = new ArrayList<>();
// 獲取 DocumentBuilderFactory的實例
DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
//獲取DOM模式的解析器對象
DocumentBuilder parser = dbf.newDocumentBuilder();
//輸入流讀取xml文檔
Document document = parser.parse(new FileInputStream(new File("src/book.xml")));
//獲取document對象中的"書"元素節(jié)點
NodeList booknodelist = document.getElementsByTagName("書");
//遍歷節(jié)點的子元素及其屬性
for (int i = 0; i < booknodelist.getLength(); i++)
{//Element接口用于獲取元素節(jié)點的屬性
Element bookitem = (Element) booknodelist.item(i);
//創(chuàng)建Book對象用于設置Book類成員及其屬性
Book book = new Book();
//書名 作者 售價 age title
//獲取書的子元素節(jié)點
NodeList childNodes = bookitem.getChildNodes();
for (int j = 0; j < childNodes.getLength(); j++)
{//遍歷子元素
if (childNodes.item(j).getNodeType() == 1)
{//如果子元素節(jié)點類型為文本節(jié)點,繼續(xù)判斷其有沒有子節(jié)點
Element child = (Element) childNodes.item(j);
//獲取節(jié)點名稱
switch (child.getNodeName())
{
case "書名"://將獲取到的xml書名標簽內容存入book對象的Name屬性中
book.setName(child.getTextContent());
break;
case "作者":
book.setAuthor(child.getTextContent());
book.setTitle(child.getAttribute("title"));
break;
case "售價":
book.setPrice(child.getTextContent());
break;
case "個人信息":
//個人信息節(jié)點還有子節(jié)點,獲取子節(jié)點標簽內的文本內容(字符串)
//存入book類的age屬性中
int age = Integer.parseInt(child.getFirstChild().getTextContent());
book.setAge(age);
break;
default:
break;
}
}
}
//遍歷完成后 將book對象加入到集合中
booklist.add(book);
}
//輸出集合
System.out.println(booklist);
}
}
BOOK類代碼:
public class Book
{// 設置和獲取book類的成員屬性及方法
String name;
String author;
String price;
int age;
String title;
public Book(String name, String author, String price, int age, String title)
{
super();
this.name = name;
this.author = author;
this.price = price;
this.age = age;
this.title = title;
}
public Book()
{
super();
}
public String getName()
{
return name;
}
public void setName(String name)
{
this.name = name;
}
public String getAuthor()
{
return author;
}
public void setAuthor(String author)
{
this.author = author;
}
public String getPrice()
{
return price;
}
public void setPrice(String price)
{
this.price = price;
}
public int getAge()
{
return age;
}
public void setAge(int age)
{
this.age = age;
}
public String getTitle()
{
return title;
}
public void setTitle(String title)
{
this.title = title;
}
@Override
public String toString()
{
return "Book [name=" + name + ", author=" + author + ", price=" + price
+ ", age=" + age + ", title=" + title + "]";
}
}
控制臺解析文檔后打印集合
[Book [name=浪潮之巔, author=吳軍, price=50, age=50, title=], Book [name=數(shù)學之美, author=陸奇, price=29, age=50, title=ADS]]