Java解析XML文件的常用方法介紹


  XML是一個可擴展標記語言。很多時候我們需要進行數據交換,同時也存在跨平台使用,XML文件對這些需求提供了很好的幫助!

  對於Java來說,XML常見的用途就是保存數據和配置,這就涉及了對XML文件的增刪改查操作!

  Java常見的XML解析方式分為DOM解析、SAX解析、DOM4j解析,下面是這三種解析方式的優缺點:

  1、DOM解析 

  方便遍歷,隨機訪問某一個節點,修改XML。缺點是一次性讀取到內存。

  2、SAX解析

  從上至下一個個節點去解析,觸發事件(調用相應的方法)來進行處理。不能對xml進行修改。占用內存小。

  3、DOM4j

  第三方的開源的解析工具,方便使用。

XML文件:(src/name.xml)

 1 <?xml version="1.0" encoding="UTF-8" standalone="no"?>
 2 <names>
 3     <name id="張三">
 4         <age>20</age>
 5     </name>
 6     <name id="李四">
 7         <age>25</age>
 8     </name>
 9     <name id="王五">
10         <age>30</age>
11     </name>
12 </names>

  下面我就來介紹DOM和DOM4j來解析上面的XML文件的方法:

DOM解析:

  1 import java.io.IOException;
  2 
  3 import javax.xml.parsers.DocumentBuilder;
  4 import javax.xml.parsers.DocumentBuilderFactory;
  5 import javax.xml.parsers.ParserConfigurationException;
  6 import javax.xml.transform.Transformer;
  7 import javax.xml.transform.TransformerConfigurationException;
  8 import javax.xml.transform.TransformerException;
  9 import javax.xml.transform.TransformerFactory;
 10 import javax.xml.transform.dom.DOMSource;
 11 import javax.xml.transform.stream.StreamResult;
 12 
 13 import org.w3c.dom.Document;
 14 import org.w3c.dom.Element;
 15 import org.w3c.dom.Node;
 16 import org.w3c.dom.NodeList;
 17 import org.xml.sax.SAXException;
 18 
 19 public class DOM {
 20 
 21     public static void main(String[] args) {
 22         // TODO Auto-generated method stub
 23         try {
 24             DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
 25             // 創建DOM解析器工廠
 26             DocumentBuilder db = dbf.newDocumentBuilder();
 27             // 調用DOM解析器工廠的newDocumentBuilder()方法得到DOM解析器對象
 28             Document doc = db.parse("src\\name.xml");
 29             // 調用DOM解析器對象parse(String uri)方法得到Document對象
 30             NodeList nl = doc.getElementsByTagName("name");
 31             // 調用Document對象的getElementsByTagName(String tagname)方法得到NodeList對象
 32             /*
 33              * 遍歷XML中的元素
 34              */
 35             for (int i = 0; i < nl.getLength(); i++) {
 36                 Node node = nl.item(i);
 37                 // 通過NodeList的item(int index)方法得到NodeList中的Node對象
 38                 Element element = (Element) node;
 39                 // 通過Node對象強制轉換的方法得到Element對象
 40                 String id = element.getAttribute("id");
 41                 // 通過Element對象的getgetAttribute(String name)方法得到id屬性值
 42                 System.out.println(id);
 43                 // 打印id屬性值
 44                 String age = element.getElementsByTagName("age").item(0).getTextContent();
 45                 // 通過Element對象的getElementsByTagName(String name)方法得到age的屬性值
 46                 System.out.println(age);
 47                 // 打印age
 48             }
 49             /*
 50              * 添加元素到XML中
 51              */
 52             Element root = doc.getDocumentElement();
 53             // 通過Document對象的getDocumentElement()方法得到根節點
 54             Element newname = doc.createElement("name");
 55             // 通過Document對象的createElement(String tagName)方法得到新的name元素
 56             newname.setAttribute("id", "小明");
 57             // 通過調用Element對象的setAttribute(String name,String value)方法為id賦值
 58             Element newage = doc.createElement("age");
 59             // 通過Document對象的createElement(String tagName)方法得到新的age元素
 60             newage.setTextContent("18");
 61             // 通過調用Element對象的setTextContent(String textContent)方法為age賦值
 62             newname.appendChild(newage);
 63             // 添加age到name中
 64             root.appendChild(newname);
 65             // 添加name到根節點中
 66             /*
 67              * 修改XML中的元素
 68              */
 69             for (int i = 0; i < nl.getLength(); i++) {
 70                 Element fixname = (Element) nl.item(i);
 71                 // 得到要修改的Element對象
 72                 String fixnewname = fixname.getAttribute("id");
 73                 // 獲取到要修改對象的id屬性值
 74                 /*
 75                  * 判斷name是否為要修改的對象
 76                  */
 77                 if (fixnewname.equals("小明")) {
 78                     Element sex = doc.createElement("sex");
 79                     // 創建新的Element對象
 80                     sex.setAttribute("sex", "男");
 81                     // 給新的Element對象的屬性賦值
 82                     fixname.appendChild(sex);
 83                     // 添加新的Element(sex)對象到Element(fixname)對象中
 84                 }
 85             }
 86             /*
 87              * 刪除XML中的元素
 88              */
 89             root.removeChild(root.getChildNodes().item(7));
 90             // 首先通過根節點訪問子節點,得到Node對象,然后調用根節點的removeChild(Node oldChild)方法刪除元素
 91             /*
 92              * 將更改寫入到XML文件中
 93              */
 94             TransformerFactory tf = TransformerFactory.newInstance();
 95             // 調用TransformerFactory的newInstance()方法得到TransformerFactory對象
 96             Transformer t = tf.newTransformer();
 97             // 調用TransformerFactory對象的newTransformer()方法得到Transformer對象
 98             t.transform(new DOMSource(doc), new StreamResult("src\\name.xml"));
 99             // 調用Transformer對象的transform(Source xmlSource,Result
100             // outputTarget)方法將修改寫入到name.xml文件中
101         } catch (ParserConfigurationException e) {
102             // TODO Auto-generated catch block
103             e.printStackTrace();
104         } catch (SAXException e) {
105             // TODO Auto-generated catch block
106             e.printStackTrace();
107         } catch (IOException e) {
108             // TODO Auto-generated catch block
109             e.printStackTrace();
110         } catch (TransformerConfigurationException e) {
111             // TODO Auto-generated catch block
112             e.printStackTrace();
113         } catch (TransformerException e) {
114             // TODO Auto-generated catch block
115             e.printStackTrace();
116         }
117     }
118 
119 }

遍歷運行結果:

1 張三
2 20
3 李四
4 25
5 王五
6 30

添加運行結果:

 1 <?xml version="1.0" encoding="UTF-8" standalone="no"?>
 2 <names>
 3     <name id="張三">
 4         <age>20</age>
 5     </name>
 6     <name id="李四">
 7         <age>25</age>
 8     </name>
 9     <name id="王五">
10         <age>30</age>
11     </name>
12     <name id="小明">
13         <age>18</age>
14     </name>
15 </names>

修改運行結果:

 1 <?xml version="1.0" encoding="UTF-8" standalone="no"?>
 2 <names>
 3     <name id="張三">
 4         <age>20</age>
 5     </name>
 6     <name id="李四">
 7         <age>25</age>
 8     </name>
 9     <name id="王五">
10         <age>30</age>
11     </name>
12     <name id="小明">
13         <age>18</age>
14         <sex sex="男" />
15     </name>
16 </names>

刪除運行結果:

 1 <?xml version="1.0" encoding="UTF-8" standalone="no"?>
 2 <names>
 3     <name id="張三">
 4         <age>20</age>
 5     </name>
 6     <name id="李四">
 7         <age>25</age>
 8     </name>
 9     <name id="王五">
10         <age>30</age>
11     </name>
12 </names>

 DOM4j解析:

使用DOM4j解析需要添加第三方工具包,具體網址:DOM4j

 1 import org.dom4j.Document;
 2 import org.dom4j.DocumentException;
 3 import org.dom4j.Element;
 4 import org.dom4j.io.SAXReader;
 5 import org.dom4j.io.XMLWriter;
 6 
 7 import java.io.FileNotFoundException;
 8 import java.io.FileOutputStream;
 9 import java.io.IOException;
10 import java.io.UnsupportedEncodingException;
11 import java.util.List;
12 
13 public class DOM4j {
14 
15     public static void main(String[] args) {
16         // TODO Auto-generated method stub
17         try {
18             // 遍歷
19             SAXReader sr = new SAXReader();
20             Document doc = sr.read("src\\name.xml");
21             Element root = doc.getRootElement();
22             List<Element> name = root.elements("name");
23             for (Element names : name) {
24                 System.out.println(names.attributeValue("id"));
25                 List<Element> age = names.elements("age");
26                 for (Element ages : age) {
27                     System.out.println(ages.getText());
28                 }
29             }
30             // 添加
31             Element newname = root.addElement("name");
32             newname.addAttribute("id", "小明");
33             Element newage = newname.addElement("age");
34             newage.setText("18");
35             //刪除
36             root.remove(name.get(3));
37             // 寫入
38             XMLWriter xw = new XMLWriter(new FileOutputStream("src\\name.xml"));
39             xw.write(doc);
40         } catch (DocumentException e) {
41             // TODO Auto-generated catch block
42             e.printStackTrace();
43         } catch (UnsupportedEncodingException e) {
44             // TODO Auto-generated catch block
45             e.printStackTrace();
46         } catch (FileNotFoundException e) {
47             // TODO Auto-generated catch block
48             e.printStackTrace();
49         } catch (IOException e) {
50             // TODO Auto-generated catch block
51             e.printStackTrace();
52         }
53     }
54 
55 }

運行結果上同。


免責聲明!

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



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