XML的編程 (CRUD)
CRUD代表的是--------增刪改查
Xml編程的作用之一:在web中寫配置文件,對文件進行解析
1、XML解析技術
(1)XML解析方式分爲兩種: Sax 和dom
(1)這兩種標準並不是針對java,在各種語言環境下都可以實現
(2)dom:(Document Object Model, 即文檔對象模型) 是 W3C 組織推薦的處理 XML 的一種方式。
實現原理:把整個xml文檔一次性讀取出來,放到一個樹形結構裏,在需要的時候,查找特定節點,然後對節點進行讀取和寫。它的主要優勢是實現簡單,讀寫平衡,缺點是比較佔內存,因爲他要把整個xml文檔都讀入內存,文件越大,這種缺點就越明顯。
(3)(Simple API for XML) 不是官方標準,但它是 XML 社區事實上的標準,幾乎所有的 XML 解析器都支持它。
實現方法:在xml文檔中查找特定條件的內容,只提取需要的內容
缺點:只能寫
(4)Xml解析器: 用開發工具包來創建解析器
Crimson、Xerces 、Aelfred2
(5)Xml開發工具包
(6)Jaxp開發包
Jaxp、Jdom、dom4j
(2)JAXP 開發包是J2SE的一部分,它由javax.xml、org.w3c.dom 、org.xml.sax 包及其子包組成
在 javax.xml.parsers 包中,定義了幾個工廠類,程序員調用這些工廠類,可以得到對xml文檔進行解析的 DOM 或 SAX 的解析器對象
使用JAXP進行DOM解析
方法爲:javax.xml.parsers 包中的DocumentBuilderFactory用於創建DOM模式的解析器對象 , DocumentBuilderFactory是一個抽象工廠類,它不能直接實例化,但該類提供了一個newInstance方法 ,這個方法會根據本地平臺默認安裝的解析器,自動創建一個工廠的對象並返回。
獲得JAXP中的DOM解析器
(1)調用 DocumentBuilderFactory.newInstance() 方法得到創建 DOM 解析器的工廠。
(2)調用工廠對象的 newDocumentBuilder方法得到 DOM 解析器對象。
(3)調用 DOM 解析器對象的 parse() 方法解析 XML 文檔,得到代表整個文檔的 Document 對象,進行可以利用DOM特性對整個XML文檔進行操作了。
DOM編程
l DOM模型(document object model)
DOM解析器在解析XML文檔時,會把文檔中的所有元素,按照其出現的層次關係,解析成一個個Node對象(節點)。
在dom中,節點之間關係如下:
位於一個節點之上的節點是該節點的父節點(parent)
一個節點之下的節點是該節點的子節點(children)
同一層次,具有相同父節點的節點是兄弟節點(sibling)
一個節點的下一個層次的節點集合是節點後代(descendant)
父、祖父節點及所有位於節點上面的,都是節點的祖先(ancestor)
l Node對象
Node對象提供了一系列常量來代表結點的類型,當開發人員獲得某個Node類型後,就可以把Node節點轉換成相應的節點對象(Node的子類對象),以便於調用其特有的方法。(查看API文檔)
Node對象提供了相應的方法去獲得它的父結點或子結點。編程人員通過這些方法就可以讀取整個XML文檔的內容、或添加、修改、刪除XML文檔的內容了。
2、編寫java程序dom方法完成xml文檔的解析
通過javax.xml.parsers 包下的類來完成解析器的創建
DocumentBuilder的對象dom解析器,通過對於的工程類來創建
DocumentBuilderFactory是抽象的類
在工廠中用newinstance()方法來得到dom解析器的工廠類
SAXParser的對象是sax解析器 ,通過對於的工程類來創建
在xml文檔中的所有內容都可以被當成節點處理
在Node節點類型定義了所有的節點的共性,在Node中的屬性是nodeName,nodeType,noValues,在用下面的這三個方法去調用之後,就把他們封裝成Node對象,根據Node中的屬性一一對應,如果節點是一個元素,則nodeValue則爲null
GetNodeName() 節點的名稱
getNodeType() 節點的類型
getNodeVaule() 節點的值
Element是元素節點 1代表元素節點
Text 文本節點 在xml中空白處是文本節點 3代表文本節點
Attr爲屬性節點
例子:解析dom文檔
// (1)生成工廠類的對象
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
// (2)生成解析器
DocumentBuilder db = factory.newDocumentBuilder();
// (3)對xml文檔進行解析,指定要讀取的文件並賦值給Document的對象
Document doc = db.parse(new File("src/Book.xml"));
// 解析出的doc對象裏面所有內容,在xml文檔中的所有內容都可以別當成節點處理
// (4)讀取book.xml文檔中有幾個節點?節點的名稱?節點的類型及節點的值
Node root = doc.getChildNodes().item(0);// 查找根節點
System.out.println(root.getNodeName() + "---" +root.getNodeType()+ "---" + root.getNodeValue());
// 查找所有根節點的子節點
public static void findChildren(Document doc) {
// 先通過文檔對象node得到根節點對象,通過根節點
// Node root = node.getChildNodes().item(0);//得到根節點
// 通過標籤名字查找元素,得到的是節點列表
Node root = doc.getElementsByTagName("書架").item(0);
// 通過根節點root對象得到根節點所有的子節點,返回一個節點集合
NodeList list = root.getChildNodes();
System.out.println("根節點下的所有子節點個數" + list.getLength());
// item()返回集合中的第 index 個項。
for (int i = 0;i < list.getLength();i++) {
Node n = list.item(i);
System.out.println(n.getNodeName() + "-----" + n.getNodeType()
+ "----" + n.getNodeValue());
}
}
// 查找所有根節點的元素節點
public static void findElementChildren(Document doc) {
// 先通過文檔對象doc得到根節點對象,通過根節點
Node root = doc.getElementsByTagName("書架").item(0);
// 通過根節點root對象得到根節點所有的子節點,返回一個節點集合
NodeList list = root.getChildNodes();
System.out.println("根節點下的所有子節點個數" + list.getLength());
boolean flag = false;
int count = 0;
for (int i = 0; i < list.getLength(); i++) {
Node n = list.item(i);
// 判斷如果是元素節點 ELEMENT_NODE表示 該節點爲 Element。
if (n.getNodeType() == Node.ELEMENT_NODE) {
System.out.println(n.getNodeName() + "-----" + n.getNodeType()
+ "----" + n.getNodeValue());
count++;
flag = true;
}
}
System.out.println("元素的節點共" + count);
}
// 查找固定值的書的元素的第二個子節點
public static void findFixedChildren(Node node) {
NodeList list = node.getChildNodes();
int count = 0;
for (int i = 0; i < list.getLength(); i++) {
boolean flag = false;
Node n1 = list.item(i);
if (n1.getNodeName().equals("圖書")) {
flag = true;
count++;
}
if (flag && count == 2) {
// 得到n1節點的所有子節點,輸出
NodeList list1 = n1.getChildNodes();
for (int j = 0; j < list.getLength(); j++) {
Node n = list1.item(j);
System.out.println(n.getNodeName() + "-----"
+ n.getNodeType() + "----" + n.getNodeValue());
}
}
}
}
// 屬性的遍歷
public static void findAttiutes(Node node) {
// 所有屬性的集合
NamedNodeMap map = node.getAttributes();
if (map != null) {
for (int i = 0; i < map.getLength(); i++) {
// 屬性節點
Node d = map.item(i);
System.out.println(d.getNodeName() + "---" + d.getNodeType()
+ "----" + d.getNodeValue());
}
}
}