轉載自:https://www.cnblogs.com/yangliguo/p/7398996.html
XML 指可擴展標記語言(EXtensible Markup Language),是獨立於軟件和硬件的信息傳輸工具,應用於 web 開發的許多方面,常用於簡化數據的存儲和共享。
xml指令
處理指令,簡稱PI (processing instruction)。處理指令用來指揮解析引擎如何解析XML文檔內容。
以下為例:
在XML中,所有的處理指令都以結束。<?后面緊跟的是處理指令的名稱。
XML 元素指的是從(且包括)開始標簽直到(且包括)結束標簽的部分。元素可包含其他元素、文本或者兩者的混合物。元素也可以擁有屬性。
XML 元素可以在開始標簽中包含屬性,屬性 (Attribute) 提供關於元素的額外(附加)信息。屬性通常提供不屬於數據組成部分的信息,但是對
需要處理這個元素的應用程序來說卻很重要。
XML 屬性必須加引號,屬性值必須被引號包圍,不過單引號和雙引號均可使用。
如果屬性值本身包含雙引號,那么有必要使用單引號包圍它,或者可以使用實體引用。
進入主題了
首先要有一個xml文件為名字為emplist.xml內容如下
1 <?xml version="1.0" encoding="UTF-8"?> 2 <list> 3 <emp id=""> 4 <name>張三</name> 5 <age></age> 6 <gender>男</gender> 7 <salary>5000</salary> 8 </emp> 9 10 </list>
XML解析方式
SAX解析方式
SAX(simple API for XML)是一種XML解析的替代方法。相比於DOM,SAX是一種速度更快,更有效的方法。它逐行掃描文檔,一邊掃描一邊解析。而且相比於DOM,SAX可以在解析文檔的任意時刻停止解析。 其優缺點分別為:
優點: 解析可以立即開始,速度快,沒有內存壓力
缺點: 不能對節點做修改
DOM解析方式
DOM:(Document Object Model, 即文檔對象模型) 是 W3C 組織推薦的處理 XML 的一種方式。DOM解析器在解析XML文檔時,會把文檔中
的所有元素,按照其出現的層次關系,解析成一個個Node對象(節點)。其優缺點分別為:
優點:把xml文件在內存中構造樹形結構,可以遍歷和修改節點
缺點: 如果文件比較大,內存有壓力,解析的時間會比較長
SAXReader讀取XML文檔
使用SAXReader需要導入dom4j-full.jar包。其是DOM4J的一個核心API,用於讀取XML文檔。
DOM4J是一個Java的XML API,類似於JDOM,用來讀寫XML文件的。DOM4J是一個非常非常優秀的Java XML API,具有性能優異、功能強
大和極端易用使用的特點,同時它也是一個開放源代碼的軟件。
1 package day12; 2 3 import java.io.File; 4 import java.util.ArrayList; 5 import java.util.List; 6 7 import org.dom4j.Attribute; 8 import org.dom4j.Document; 9 import org.dom4j.Element; 10 import org.dom4j.io.SAXReader; 11 12 /** 13 * 使用DOM解析xml文檔 14 * @author ylg 15 * 16 */ 17 public class ParseXmlDemo { 18 public static void main(String[] args) { 19 try { 20 /* 21 * 解析XML大致流程 22 * 1:創建SAXReader 23 * 2:使用SAXReader讀取數據源(xml文檔信息) 24 * 並生成一個Document對象,該對象即表示 25 * xml文檔內容。DOM耗時耗內存資源也是在 26 * 這一步體現的。因為會對整個XML文檔進行 27 * 讀取並載入內存。 28 * 3:通過Document對象獲取根元素 29 * 4:根據XML文檔結構從根元素開始逐層獲取 30 * 子元素最終以達到遍歷XML文檔內容的目的 31 * 32 */ 33 //1 34 SAXReader reader = new SAXReader(); 35 36 //2 37 Document doc 38 = reader.read(new File("emplist.xml")); 39 40 /* 41 * 3 42 * Document提供了方法: 43 * Element getRootElement() 44 * 該方法是用來獲取XML文檔中的根元素, 45 * 對於emplist.xml文檔而言,根元素就是 46 * <list>標簽。 47 * 48 * Element類 49 * 每一個Element實例都可以表示XML文檔中的 50 * 一個元素,即:一對標簽。 51 */ 52 Element root = doc.getRootElement(); 53 /* 54 * Element提供了方法: 55 * String getName() 56 * 該方法可以獲取當前元素的名字(標簽名) 57 */ 58 System.out.println( 59 "獲取了根元素:"+root.getName() 60 ); 61 //4 62 /* 63 * 獲取一個元素中的子元素 64 * Element提供了相關方法: 65 * 66 * 1 67 * Element element(String name) 68 * 獲取當前元素下指定名字的子元素。 69 * 70 * 2: 71 * List elements() 72 * 獲取當前元素下所有子元素 73 * 74 * 3: 75 * List elements(String name) 76 * 獲取當前元素下所有同名子元素 77 * 78 * 2,3返回的集合中的每一個元素都是Element 79 * 的實例,每個實例表示其中的一個子元素。 80 * 81 */ 82 //獲取所有emp標簽 83 List<Element> list = root.elements(); 84 85 //用於保存所有員工信息的List集合 86 List<Emp> empList = new ArrayList<Emp>(); 87 88 for(Element empEle : list){ 89 // System.out.println(empEle.getName()); 90 //獲取員工名字 91 Element nameEle = empEle.element("name"); 92 /* 93 * Element還提供了獲取當前元素中文本的方法: 94 * String getText(),String getTextTrim() 95 */ 96 String name = nameEle.getText(); 97 System.out.println("name:"+name); 98 99 //獲取員工年齡 100 int age = Integer.parseInt( 101 empEle.elementText("age") 102 ); 103 104 //獲取性別 105 String gender = empEle.elementText("gender"); 106 107 //獲取工資 108 int salary = Integer.parseInt( 109 empEle.elementText("salary") 110 ); 111 /* 112 * Attribute attribute(String name) 113 * 獲取當前元素(標簽)中指定名字的屬性 114 * 115 * Attribute的每一個實例用於表示一個 116 * 屬性。其中常用方法: 117 * String getName():獲取屬性名 118 * String getValue():獲取屬性值 119 */ 120 Attribute attr 121 = empEle.attribute("id"); 122 int id = Integer.parseInt( 123 attr.getValue() 124 ); 125 126 Emp emp = new Emp(id,name,age,gender,salary); 127 empList.add(emp); 128 } 129 System.out.println("解析完畢!"); 130 for(Emp emp : empList){ 131 System.out.println(emp); 132 } 133 134 135 } catch (Exception e) { 136 e.printStackTrace(); 137 } 138 } 139 }
寫XML
構建Document對象
使用DOM4J我們還可以通過自行構建Document對象,並組建樹狀結構來描述一個XML文檔,並使用DOM4J將其寫入一個文件。
1 import java.io.FileOutputStream; 2 import java.util.ArrayList; 3 import java.util.List; 4 5 import org.dom4j.Document; 6 import org.dom4j.DocumentHelper; 7 import org.dom4j.Element; 8 import org.dom4j.io.OutputFormat; 9 import org.dom4j.io.XMLWriter; 10 11 /** 12 * 使用DOM生成XML文檔 13 * @author ylg 14 * 15 */ 16 public class WriteXmlDemo { 17 public static void main(String[] args) { 18 List<Emp> list = new ArrayList<Emp>(); 19 list.add(new Emp(1,"張三",25,"男",5000)); 20 list.add(new Emp(2,"李四",26,"女",6000)); 21 list.add(new Emp(3,"王五",27,"男",7000)); 22 list.add(new Emp(4,"趙六",28,"女",8000)); 23 list.add(new Emp(5,"錢七",29,"男",9000)); 24 /* 25 * 使用DOM生成XML文檔的大致步驟: 26 * 1:創建一個Document對象表示一個空文檔 27 * 2:向Document中添加根元素 28 * 3:按照文檔應有的結構從根元素開始順序添加 29 * 子元素來形成該文檔結構。 30 * 4:創建XmlWriter對象 31 * 5:將Document對象寫出 32 * 若寫入到文件中則形成一個xml文件 33 * 也可以寫出到網絡中作為傳輸數據使用 34 */ 35 36 //1 37 Document doc 38 = DocumentHelper.createDocument(); 39 40 /* 41 * 2 42 * Document提供了添加根元素的方法: 43 * Element addElement(String name) 44 * 向當前文檔中添加指定名字的根元素,返回 45 * 的Element就表示這個根元素。 46 * 需要注意,該方法只能調用一次,因為一個 47 * 文檔只能有一個根元素。 48 */ 49 Element root = doc.addElement("list"); 50 51 //3 52 for(Emp emp : list){ 53 /* 54 * Element也提供了追加子元素的方法: 55 * Element addElement(String name) 56 * 調用次數沒有限制,元素可以包含若干 57 * 子元素。 58 */ 59 Element empEle = root.addElement("emp"); 60 61 //添加name信息 62 Element nameEle = empEle.addElement("name"); 63 nameEle.addText(emp.getName()); 64 65 //添加age信息 66 Element ageEle = empEle.addElement("age"); 67 ageEle.addText(emp.getAge()+""); 68 69 //添加gender信息 70 Element genderEle = empEle.addElement("gender"); 71 genderEle.addText(emp.getGender()); 72 73 //添加salary信息 74 Element salEle = empEle.addElement("salary"); 75 salEle.addText(emp.getSalary()+""); 76 77 /* 78 * 向當前元素中添加指定名字以及對應值的屬性 79 */ 80 empEle.addAttribute("id", emp.getId()+""); 81 82 } 83 try{ 84 //4 85 XMLWriter writer = new XMLWriter(OutputFormat.createPrettyPrint()); 86 FileOutputStream fos 87 = new FileOutputStream("myemp.xml"); 88 writer.setOutputStream(fos); 89 90 //5 91 writer.write(doc); 92 System.out.println("寫出完畢!"); 93 writer.close(); 94 }catch(Exception e){ 95 e.printStackTrace(); 96 } 97 } 98 }
注意事項:
XPath 路徑表達式
XPath 是一門在 XML 文檔中查找信息的語言。XPath 可用來在 XML 文檔中對元素和屬性進行遍歷。由於我們單純使用dom定位節點時,大部
分時間需要一層一層的處理,如果有了xPath,我們定位我們的節點將變得很輕松。他可以根據路徑,屬性,甚至是條件進行節點的檢索。
XPath 使用路徑表達式在XML 文檔中進行導航
XPath 包含一個標准函數庫
XPath 是 XSLT 中的主要元素
XPath 是一個 W3C 標准
路徑表達式語法:
斜杠(/)作為路徑內部的分割符。
同一個節點有絕對路徑和相對路徑兩種寫法:
路徑(absolute path)必須用"/"起首,后面緊跟根節點,比如/step/step/...。
相對路徑(relative path)則是除了絕對路徑以外的其他寫法,比如 step/step, 也就是不使用"/"起首。
"."表示當前節點。
".."表示當前節點的父節點
nodename(節點名稱):表示選擇該節點的所有子節點
"/":表示選擇根節點
"//":表示選擇任意位置的某個節點
"@": 表示選擇某個屬性