1.java中解析xml的幾種方式
1.1 JDK原生dom形式 原理:一次性把xml讀入內存,在內存中構建成樹形結構。優點:對節點操作方便,缺點:需要大量的內存空間,浪費資源
1.2 SAX形式 原理:基於事件形式,當解析器發現元素開始、元素結束、文本、文檔的開始或結束等時,發送事件,程序員編寫響應這些事件的代碼,保存數據。優點:相對於dom形式更快捷,占用資源少。缺點:沒有持久話。事件過后,若沒保存數據,那么數據就丟了。
1.3 DOM4J 它是一個開源的框架,具有性能優異、功能強大和極端易用使用的特點。
1.4 JAXB(Java Architecture for XML Binding) 是一個業界的標准,是一項可以根據XML Schema產生Java類的技術。
2.JAXB的幾個核心對象
2.1 JAXBContext Jaxb的上下文,通過這個對象我們能拿到另外兩個核心對象Unmarshaller(用於解析xml)和Marshaller(生成xml)
2.2 JAXBContext通常使用它的靜態方法newInstance(Class className)來獲得對象
2.3 Unmarshaller用於解析xml 通過JAXBContext的createUnmarshaller方法獲得到
2.4 Marshaller用於生成xml 通過JAXBContext的createMarshaller方法獲得到
3.示例代碼
3.1 實體類Bean與Property
1 package org.lyrk.accp8.s2.chapter.xml; 2 3 import javax.xml.bind.annotation.*; 4 5 /** 6 * Created by niechen on 17/5/9. 7 */ 8 @XmlRootElement 9 @XmlAccessorType(XmlAccessType.FIELD) 10 public class Bean { 11 12 @XmlElement 13 private Property property; 14 15 public Property getProperty() { 16 return property; 17 } 18 19 public void setProperty(Property property) { 20 this.property = property; 21 } 22 } 23 24 @XmlAccessorType(value = XmlAccessType.FIELD) 25 class Property { 26 @XmlAttribute(name = "id") 27 private String id; 28 29 @XmlAttribute(name = "value") 30 private String value; 31 32 public String getId() { 33 return id; 34 } 35 36 public void setId(String id) { 37 this.id = id; 38 } 39 40 public String getValue() { 41 return value; 42 } 43 44 public void setValue(String value) { 45 this.value = value; 46 } 47 }
3.2 主函數類
1 package org.lyrk.accp8.s2.chapter.xml; 2 3 import javax.xml.bind.JAXBContext; 4 import javax.xml.bind.JAXBException; 5 import javax.xml.bind.Unmarshaller; 6 import java.io.InputStream; 7 8 /** 9 * Created by niechen on 17/5/9. 10 */ 11 public class Test { 12 13 public static void main(String[] args) { 14 try { 15 JAXBContext jaxbContext = JAXBContext.newInstance(Bean.class);//創建JAXBContext對象,注意一定要傳@XmlRootElement的所標記的類的類型 16 Unmarshaller unmarshaller = jaxbContext.createUnmarshaller();//拿到xml解析對象 17 InputStream inputStream = Bean.class.getClassLoader().getResourceAsStream("bean.xml");//在classpath下讀取xml的文件流 18 Bean bean = (Bean) unmarshaller.unmarshal(inputStream);//將xml轉換成實體對象 19 System.out.println(bean.getProperty().getId());//輸出ID屬性 20 System.out.println(bean.getProperty().getValue());//輸出value屬性 21 } catch (JAXBException e) { 22 e.printStackTrace(); 23 } 24 } 25 }
3.3 xml文件內容
1 <?xml version="1.0" encoding="UTF-8"?> 2 <bean> 3 <property id="name" value="10" /> 4 </bean>