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>
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 }
二、新建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 }
修改標籤內容
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 }
刪除標籤
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 }