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 }

运行结果上同。

版权声明:本文为min-li原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://www.cnblogs.com/min-li/p/9773201.html