JAVA對XML文件的讀寫


轉載自: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(節點名稱):表示選擇該節點的所有子節點
      "/":表示選擇根節點
      "//":表示選擇任意位置的某個節點
      "@": 表示選擇某個屬性


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM