xml 是一个可扩展标记语言. 很多时候我们需要进行数据交换, 同时也存在跨平台使用, xml 文件对这些需求提供了很好的帮助!
对于 Java 来说, xml 常见的用途就是保存数据和配置, 这就涉及了对 xml 文件的增删改查操作!
Java 常见的 xml 解析方式分为 DOM 解析, SAX 解析, DOM4j 解析, 下面是这三种解析方式的优缺点:
1,DOM 解析
方便遍历, 随机访问某一个节点, 修改 xml. 缺点是一次性读取到内存.
2,SAX 解析
从上至下一个个节点去解析, 触发事件 (调用相应的方法) 来进行处理. 不能对 xml 进行修改. 占用内存小.
3,DOM4j
第三方的开源的解析工具, 方便使用.
xml 文件:(src/name.xml)
- <?xml version="1.0" encoding="UTF-8" standalone="no"?>
- <names>
- <name id="张三">
- <age>20</age>
- </name>
- <name id="李四">
- <age>25</age>
- </name>
- <name id="王五">
- <age>30</age>
- </name>
- </names>
下面我就来介绍 DOM 和 DOM4j 来解析上面的 xml 文件的方法:
DOM 解析:
- import java.io.IOException;
- import javax.xml.parsers.DocumentBuilder;
- import javax.xml.parsers.DocumentBuilderFactory;
- import javax.xml.parsers.ParserConfigurationException;
- import javax.xml.transform.Transformer;
- import javax.xml.transform.TransformerConfigurationException;
- import javax.xml.transform.TransformerException;
- import javax.xml.transform.TransformerFactory;
- import javax.xml.transform.dom.DOMSource;
- import javax.xml.transform.stream.StreamResult;
- import org.w3c.dom.Document;
- import org.w3c.dom.Element;
- import org.w3c.dom.Node;
- import org.w3c.dom.NodeList;
- import org.xml.sax.SAXException;
- public class DOM {
- public static void main(String[] args) {
- // TODO Auto-generated method stub
- try {
- DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
- // 创建 DOM 解析器工厂
- DocumentBuilder db = dbf.newDocumentBuilder();
- // 调用 DOM 解析器工厂的 newDocumentBuilder()方法得到 DOM 解析器对象
- Document doc = db.parse("src\\name.xml");
- // 调用 DOM 解析器对象 parse(String uri)方法得到 Document 对象
- NodeList nl = doc.getElementsByTagName("name");
- // 调用 Document 对象的 getElementsByTagName(String tagname)方法得到 NodeList 对象
- /*
- * 遍历 xml 中的元素
- */
- for (int i = 0; i <nl.getLength(); i++) {
- Node node = nl.item(i);
- // 通过 NodeList 的 item(int index)方法得到 NodeList 中的 Node 对象
- Element element = (Element) node;
- // 通过 Node 对象强制转换的方法得到 Element 对象
- String id = element.getAttribute("id");
- // 通过 Element 对象的 getgetAttribute(String name)方法得到 id 属性值
- System.out.println(id);
- // 打印 id 属性值
- String age = element.getElementsByTagName("age").item(0).getTextContent();
- // 通过 Element 对象的 getElementsByTagName(String name)方法得到 age 的属性值
- System.out.println(age);
- // 打印 age
- }
- /*
- * 添加元素到 xml 中
- */
- Element root = doc.getDocumentElement();
- // 通过 Document 对象的 getDocumentElement()方法得到根节点
- Element newname = doc.createElement("name");
- // 通过 Document 对象的 createElement(String tagName)方法得到新的 name 元素
- newname.setAttribute("id", "小明");
- // 通过调用 Element 对象的 setAttribute(String name,String value)方法为 id 赋值
- Element newage = doc.createElement("age");
- // 通过 Document 对象的 createElement(String tagName)方法得到新的 age 元素
- newage.setTextContent("18");
- // 通过调用 Element 对象的 setTextContent(String textContent)方法为 age 赋值
- newname.appendChild(newage);
- // 添加 age 到 name 中
- root.appendChild(newname);
- // 添加 name 到根节点中
- /*
- * 修改 xml 中的元素
- */
- for (int i = 0; i < nl.getLength(); i++) {
- Element fixname = (Element) nl.item(i);
- // 得到要修改的 Element 对象
- String fixnewname = fixname.getAttribute("id");
- // 获取到要修改对象的 id 属性值
- /*
- * 判断 name 是否为要修改的对象
- */
- if (fixnewname.equals("小明")) {
- Element sex = doc.createElement("sex");
- // 创建新的 Element 对象
- sex.setAttribute("sex", "男");
- // 给新的 Element 对象的属性赋值
- fixname.appendChild(sex);
- // 添加新的 Element(sex)对象到 Element(fixname)对象中
- }
- }
- /*
- * 删除 xml 中的元素
- */
- root.removeChild(root.getChildNodes().item(7));
- // 首先通过根节点访问子节点, 得到 Node 对象, 然后调用根节点的 removeChild(Node oldChild)方法删除元素
- /*
- * 将更改写入到 xml 文件中
- */
- TransformerFactory tf = TransformerFactory.newInstance();
- // 调用 TransformerFactory 的 newInstance()方法得到 TransformerFactory 对象
- Transformer t = tf.newTransformer();
- // 调用 TransformerFactory 对象的 newTransformer()方法得到 Transformer 对象
- t.transform(new DOMSource(doc), new StreamResult("src\\name.xml"));
- // 调用 Transformer 对象的 transform(Source xmlSource,Result
- // outputTarget)方法将修改写入到 name.xml 文件中
- } catch (ParserConfigurationException e) {
- // TODO Auto-generated catch block
- e.printStackTrace();
- } catch (SAXException e) {
- // TODO Auto-generated catch block
- e.printStackTrace();
- } catch (IOException e) {
- // TODO Auto-generated catch block
- e.printStackTrace();
- } catch (TransformerConfigurationException e) {
- // TODO Auto-generated catch block
- e.printStackTrace();
- } catch (TransformerException e) {
- // TODO Auto-generated catch block
- e.printStackTrace();
- }
- }
- }
遍历运行结果:
张三
20
李四
25
王五
30
添加运行结果:
- <?xml version="1.0" encoding="UTF-8" standalone="no"?>
- <names>
- <name id="张三">
- <age>20</age>
- </name>
- <name id="李四">
- <age>25</age>
- </name>
- <name id="王五">
- <age>30</age>
- </name>
- <name id="小明">
- <age>18</age>
- </name>
- </names>
修改运行结果:
- <?xml version="1.0" encoding="UTF-8" standalone="no"?>
- <names>
- <name id="张三">
- <age>20</age>
- </name>
- <name id="李四">
- <age>25</age>
- </name>
- <name id="王五">
- <age>30</age>
- </name>
- <name id="小明">
- <age>18</age>
- <sex sex="男" />
- </name>
- </names>
删除运行结果:
- <?xml version="1.0" encoding="UTF-8" standalone="no"?>
- <names>
- <name id="张三">
- <age>20</age>
- </name>
- <name id="李四">
- <age>25</age>
- </name>
- <name id="王五">
- <age>30</age>
- </name>
- </names>
DOM4j 解析:
使用 DOM4j 解析需要添加第三方工具包, 具体网址: DOM4j
- import org.dom4j.Document;
- import org.dom4j.DocumentException;
- import org.dom4j.Element;
- import org.dom4j.io.SAXReader;
- import org.dom4j.io.XMLWriter;
- import java.io.FileNotFoundException;
- import java.io.FileOutputStream;
- import java.io.IOException;
- import java.io.UnsupportedEncodingException;
- import java.util.List;
- public class DOM4j {
- public static void main(String[] args) {
- // TODO Auto-generated method stub
- try {
- // 遍历
- SAXReader sr = new SAXReader();
- Document doc = sr.read("src\\name.xml");
- Element root = doc.getRootElement();
- List<Element> name = root.elements("name");
- for (Element names : name) {
- System.out.println(names.attributeValue("id"));
- List<Element> age = names.elements("age");
- for (Element ages : age) {
- System.out.println(ages.getText());
- }
- }
- // 添加
- Element newname = root.addElement("name");
- newname.addAttribute("id", "小明");
- Element newage = newname.addElement("age");
- newage.setText("18");
- // 删除
- root.remove(name.get(3));
- // 写入
- XMLWriter xw = new XMLWriter(new FileOutputStream("src\\name.xml"));
- xw.write(doc);
- } catch (DocumentException e) {
- // TODO Auto-generated catch block
- e.printStackTrace();
- } catch (UnsupportedEncodingException e) {
- // TODO Auto-generated catch block
- e.printStackTrace();
- } catch (FileNotFoundException e) {
- // TODO Auto-generated catch block
- e.printStackTrace();
- } catch (IOException e) {
- // TODO Auto-generated catch block
- e.printStackTrace();
- }
- }
- }
运行结果上同.
来源: https://www.cnblogs.com/min-li/p/9773201.html