XML解析--DOM解析

xml解析:用程序來讀取xml的內容。html

xml的解析方式有兩種:java

一、DOM解析oracle

二、SAX解析框架

xml解析對應的工具大體有如下幾種:dom

DOM解析工具:ide

  1)JAXP(oracle-Sun公司官方)工具

  2)JDOM工具(非官方)編碼

  3)Dom4J工具(非官方)三大框架默認讀取xml的工具就是Dom4Jspa

SAX解析工具:3d

  1)Sax解析工具(oracle-sun 公司官方)

DOM解析

原理:xml解析器一次性把整個xml文檔加載進內存,而後在內存中構建一顆Document的對象樹,經過Document對象,獲得樹上的節點對象,經過節點對象訪問(操做)xml文檔的內容。

DOM(Document Object Model)文檔對象模型,DOM的三層模型將html和xml定義成樹形結構,文檔中的標籤、屬性、文本等都封裝成節點對象。

節點對象:

根節點:沒有父節點的節點對象,xml中只有一個根節點。

元素節點:根節點和根節點中的全部標籤都是元素節點。

屬性節點:<student id=「001」></student> id就是屬性節點。

文本節點:<name>zhangsan</name> zhangsan就是文本節點

註釋節點:<!-- --> xml文檔中的註釋信息

Dom4j使用

Dom4j工具是非官方的,這裏提供一個下載地址:http://pan.baidu.com/s/1c5WL0i

Dom4j中集成的 XPath(路徑查詢語言)支持、 XML Schema(約束模式文檔)支持。

使用步驟:

1)導入dom4j的核心包,dom4j-1.6.1.jar

2)編寫Dom4j讀取xml文件的代碼。

Dom4j的體系結構

經常使用方法API

1)獲取xml文檔對象Document:

1 File xmlFile = new File(「test.xml」);//找到文件
2 SAXReader reader = new SAXReader(); //建立reader對象
3 Document xmlDoc = reader.read(xmlFile); //讀取xml文件,並生成document對象

2)獲取標籤元素節點

1 Element root = xmlDoc.getRootElement(); //獲取根元素對象
2 String elementName = root.getName(); //獲取根元素的標籤名
3 lement element = root.element(「元素名稱"); //經過元素名稱獲取第一個元素名稱的對象
4 List elementList = root.elements(); //獲取全部這季節子元素的集合
5 Iterator<Element> root.elementIterator("標籤名");// 指定名稱的全部子標籤

3)獲取屬性元素節點

1 Attribute   attribute = element.attribute(「屬性名稱"); //經過屬性名獲取元素屬性對象
2 Attribute  attribute = element.attribute(0); //經過索引獲取屬性對象
3 List  attributeList = root.attributes(); //獲取全部屬性對象集合
4 Iterator<Attribute> root.attibuteIterator(); //獲取全部屬性對象
5 String value = attribute.getValue(); //經過屬性值
6 String name = attribute.getName(); //經過屬性名
7 String  value = element.attributeValue(「屬性名稱」); //經過屬性名來獲取元素的屬性值

4)獲取屬性文本節點

1 String text = element.getText(); //獲取element元素的內部文本
2 String text = element.elementText(「子元素名稱」); //獲取element子元素內部文本

5)建立增長操做(文檔對象、標籤、屬性、文本)

1 Document document = DocumentHelper. createDocument(); //建立文檔Document
2 Element element = document.addElement(「元素名稱"); //建立元素
3 element. addAttribute(「屬性名」,「屬性值");  //建立屬性--添加屬性方法返回的是原元素對象。如同StringBuffer。
4 element.addText(「文本"); //建立文本

6)修改操做(屬性、文本)

 1 //=====修改屬性
 2 Element contactElem = doc.getRootElement().element("contact");
 3 Attribute idAttr = contactElem.attribute("id");
 4 idAttr.setValue("003"); //經過屬性對象來修改屬性值
 5 
 6 Element contactElem = doc.getRootElement().element("contact");
 7 contactElem.addAttribute("id", "004"); //經過添加的方式來進行覆蓋修改
 8 
 9 //=====修改文本
10 Element rootElem = doc.getRootElement().
11 rootElem.setText("李四"); //修改文本

7)刪除操做(標籤、屬性、文本)

1 remove(Element element) //刪除標籤
2 remove(Attribute attribute)  //刪除屬性
3 remove(Text text)  //刪除文本

8)寫出xml文檔

1 FileOutputStream out = new FileOutputStream("e:/contact.xml"); //指定文件輸出的位置
2 //指定寫出格式
3 OutputFormat format = OutputFormat.createCompactFormat(); //緊湊的格式.去除空格換行.項目上線的時候
4 //OutputFormat format = OutputFormat.createPrettyPrint(); //漂亮的格式.有空格和換行.開發調試的時候
5 format.setEncoding("utf-8"); //指定生成的xml文檔的編碼,同時影響了xml文檔保存時的編碼  和  xml文檔聲明的encoding的編碼(xml解析時的編碼)
6 XMLWriter writer = new XMLWriter(out,format); 1.建立寫出對象
7 writer.write(doc); //寫出對象
8 writer.close(); //關閉流

 代碼示例:

一、把xml文檔信息封裝到對象中

contact.xml文件

 1 <?xml version="1.0" encoding="utf-8"?>
 2 <contactList>
 3     <contact id="001">
 4         <name>張三</name>
 5         <age>20</age>
 6         <phone>134222223333</phone>
 7         <email>zhangsan@qq.com</email>
 8         <qq>432221111</qq>
 9     </contact>
10     <contact id="002">
11         <name>李四</name>
12         <age>20</age>
13         <phone>134222225555</phone>
14         <email>lisi@qq.com</email>
15         <qq>432222222</qq>
16     </contact>
17 </contactList>
View Code

java文件

 1 import java.util.List;
 2 
 3 import org.dom4j.Document;
 4 import org.dom4j.Element;
 5 import org.dom4j.io.SAXReader;
 6 
 7 /**
 8  * 把xml文檔信息封裝到對象中
 9  * @author APPle
10  *
11  */
12 public class Demo4 {
13 
14         public static void main(String[] args) throws Exception{
15             List<Contact> list = new ArrayList<Contact>();
16             
17             //讀取xml,封裝對象
18             SAXReader reader = new SAXReader();
19             Document doc = reader.read(new File("./src/contact.xml"));
20             //讀取contact標籤
21             Iterator<Element> it = doc.getRootElement().elementIterator("contact");
22             while(it.hasNext()){
23                 Element elem = it.next();
24                 //建立Contact
25                 Contact contact = new Contact();
26                 contact.setId(elem.attributeValue("id"));
27                 contact.setName(elem.elementText("name"));
28                 contact.setAge(elem.elementText("age"));
29                 contact.setPhone(elem.elementText("phone"));
30                 contact.setEmail(elem.elementText("email"));
31                 contact.setQq(elem.elementText("qq"));
32                 list.add(contact);
33             }
34             
35             for (Contact contact : list) {
36                 System.out.println(contact);
37             }
38         }
39 }
View Code

二、新建xml文檔,並修改和刪除裏面的內容

建立xml文檔的java代碼:

 1 public void createXMLDocument() throws Exception{
 2         //1.內存建立xml文檔
 3         Document doc = DocumentHelper.createDocument();
 4         
 5         //2.寫入內容
 6         Element rootElem = doc.addElement("Students");
 7         
 8         //2.1 增長標籤
 9         Element studentElem1 = rootElem.addElement("Student");
10         //2.2 增長屬性
11         studentElem1.addAttribute("id", "1");
12         //2.3 增長標籤,同時設置文本
13         studentElem1.addElement("name").setText("張三");
14         studentElem1.addElement("gender").setText("男");
15         studentElem1.addElement("grade").setText("計算機1班");
16         studentElem1.addElement("address").setText("廣州");
17         
18         //2.1 增長標籤
19         Element studentElem2 = rootElem.addElement("Student");
20         //2.2 增長屬性
21         studentElem2.addAttribute("id", "2");
22         //2.3 增長標籤,同時設置文本
23         studentElem2.addElement("name").setText("李四");
24         studentElem2.addElement("gender").setText("女");
25         studentElem2.addElement("grade").setText("計算機2班");
26         studentElem2.addElement("address").setText("北京");
27         
28         
29         //3.內容寫出到xml文件
30         //3.1 輸出位置
31         FileOutputStream out = new FileOutputStream("e:/student.xml");
32         //3.2 指定格式
33         OutputFormat format = OutputFormat.createPrettyPrint();
34         // 設置編碼
35         format.setEncoding("utf-8");
36         XMLWriter writer = new XMLWriter(out,format);
37         //3.3 寫出內容
38         writer.write(doc);
39         //3.4關閉資源
40         writer.close();
41         
42     }
View Code

修改標籤內容

 1 public void changeContent() throws Exception{
 2         //1.查詢到id爲2的學生
 3         Document doc = new SAXReader().read(new File("e:/student.xml"));
 4         //1.1 找到全部的Student標籤
 5         Iterator<Element> it = doc.getRootElement().elementIterator("Student");
 6         while(it.hasNext()){
 7             Element stuElem = it.next();
 8             //1.2 查詢id爲id的學生標籤
 9             if(stuElem.attributeValue("id").equals("2")){
10                 stuElem.element("name").setText("王麗");
11                 break;
12             }
13         }
14     
15         
16         //3.1 輸出位置
17         FileOutputStream out = new FileOutputStream("e:/student.xml");
18         //3.2 指定格式
19         OutputFormat format = OutputFormat.createPrettyPrint();
20         // 設置編碼
21         format.setEncoding("utf-8");
22         XMLWriter writer = new XMLWriter(out,format);
23         //3.3 寫出內容
24         writer.write(doc);
25         //3.4關閉資源
26         writer.close();
27     }
View Code

刪除標籤

 1 public void deleteContent() throws Exception{
 2         //1.查詢到id爲2的學生
 3         Document doc = new SAXReader().read(new File("e:/student.xml"));
 4         //1.1 找到全部的Student標籤
 5         Iterator<Element> it = doc.getRootElement().elementIterator("Student");
 6         while(it.hasNext()){
 7             Element stuElem = it.next();
 8             //1.2 查詢id爲id的學生標籤
 9             if(stuElem.attributeValue("id").equals("2")){
10                 //1.3 刪除該學生標籤
11                 stuElem.detach();
12                 break;
13             }
14         }
15     
16         
17         //3.1 輸出位置
18         FileOutputStream out = new FileOutputStream("e:/student.xml");
19         //3.2 指定格式
20         OutputFormat format = OutputFormat.createPrettyPrint();
21         // 設置編碼
22         format.setEncoding("utf-8");
23         XMLWriter writer = new XMLWriter(out,format);
24         //3.3 寫出內容
25         writer.write(doc);
26         //3.4關閉資源
27         writer.close();
28     }
View Code
相關文章
相關標籤/搜索