JAVA增删改查XML文件

  最近总是需要进行xml的相关操作。   不免的要进行xml的读取修改等,于是上网搜索,加上自己的小改动,整合了下xml的常用操作。

  读取XML配置文件

  首先我们需要通过DocumentBuilderFactory获取xml文件的工厂实例。

DocumentBuilderFactory dbf=DocumentBuilderFactory.newInstance();
        dbf.setIgnoringElementContentWhitespace(true);

  创建文档对象

1 DocumentBuilder db = dbf.newDocumentBuilder();
2             Document doc = db.parse(xmlPath); // 使用dom解析xml文件

  最后遍历列表,进行数据提取

 1 NodeList sonlist = doc.getElementsByTagName("son"); 
 2             for (int i = 0; i < sonlist.getLength(); i++) // 循环处理对象
 3             {
 4                 Element son = (Element)sonlist.item(i);;
 5                 
 6                 for (Node node = son.getFirstChild(); node != null; node = node.getNextSibling()){  
 7                     if (node.getNodeType() == Node.ELEMENT_NODE){  
 8                         String name = node.getNodeName();  
 9                         String value = node.getFirstChild().getNodeValue();  
10                         System.out.println(name+" : "+value);
11                     }  
12                 }  
13             }

  全部代码

 1 public static void getFamilyMemebers(){
 2         DocumentBuilderFactory dbf=DocumentBuilderFactory.newInstance();
 3         dbf.setIgnoringElementContentWhitespace(true);
 4         try {
 5             DocumentBuilder db = dbf.newDocumentBuilder();
 6             Document doc = db.parse(xmlPath); // 使用dom解析xml文件
 7 
 8             NodeList sonlist = doc.getElementsByTagName("son"); 
 9             for (int i = 0; i < sonlist.getLength(); i++) // 循环处理对象
10             {
11                 Element son = (Element)sonlist.item(i);;
12                 
13                 for (Node node = son.getFirstChild(); node != null; node = node.getNextSibling()){  
14                     if (node.getNodeType() == Node.ELEMENT_NODE){  
15                         String name = node.getNodeName();  
16                         String value = node.getFirstChild().getNodeValue();  
17                         System.out.println(name+" : "+value);
18                     }  
19                 }  
20             }
21         } catch (Exception e) {
22             e.printStackTrace();
23         }
24     }

  在XML文件中增加节点

  差不多同样的步骤,先获取根节点,创建一个新的节点,向其中添加元素信息,最后把这个新节点添加到根节点中

 1 Element root = xmldoc.getDocumentElement();
 2             
 3             //删除指定节点
 4             
 5             Element son =xmldoc.createElement("son");
 6             son.setAttribute("id", "004");
 7             
 8             Element name = xmldoc.createElement("name");
 9             name.setTextContent("小儿子");
10             son.appendChild(name);
11 
12             Element age = xmldoc.createElement("name");
13             age.setTextContent("0");
14             son.appendChild(age);
15             
16             root.appendChild(son);

  最后不要忘记保存新增的文件,对源文件进行覆盖。

1 TransformerFactory factory = TransformerFactory.newInstance();
2             Transformer former = factory.newTransformer();
3             former.transform(new DOMSource(xmldoc), new StreamResult(new File(xmlPath)));

  全部代码:

 1     public static void createSon() {
 2         DocumentBuilderFactory dbf=DocumentBuilderFactory.newInstance();
 3         dbf.setIgnoringElementContentWhitespace(false);
 4         
 5         try{
 6         
 7             DocumentBuilder db=dbf.newDocumentBuilder();
 8             Document xmldoc=db.parse(xmlPath);
 9         
10             Element root = xmldoc.getDocumentElement();
11             
12             //删除指定节点
13             
14             Element son =xmldoc.createElement("son");
15             son.setAttribute("id", "004");
16             
17             Element name = xmldoc.createElement("name");
18             name.setTextContent("小儿子");
19             son.appendChild(name);
20 
21             Element age = xmldoc.createElement("name");
22             age.setTextContent("0");
23             son.appendChild(age);
24             
25             root.appendChild(son);
26             //保存
27             TransformerFactory factory = TransformerFactory.newInstance();
28             Transformer former = factory.newTransformer();
29             former.transform(new DOMSource(xmldoc), new StreamResult(new File(xmlPath)));
30             
31         }catch(Exception e){
32             e.printStackTrace();
33         }
34     }

  在XML中修改节点信息

  通过XPath来获取目标节点

 1 public static Node selectSingleNode(String express, Element source) {
 2         Node result=null;
 3         XPathFactory xpathFactory=XPathFactory.newInstance();
 4         XPath xpath=xpathFactory.newXPath();
 5         try {
 6             result=(Node) xpath.evaluate(express, source, XPathConstants.NODE);
 7         } catch (XPathExpressionException e) {
 8             e.printStackTrace();
 9         }
10         
11         return result;
12     }

  获取目标节点,进行修改,完成后,保存文件。

1 Element root = xmldoc.getDocumentElement();
2             
3             Element per =(Element) selectSingleNode("/father/son[@id='001']", root);
4             per.getElementsByTagName("age").item(0).setTextContent("27");
5             
6             TransformerFactory factory = TransformerFactory.newInstance();
7             Transformer former = factory.newTransformer();
8             former.transform(new DOMSource(xmldoc), new StreamResult(new File(xmlPath)));

  全部代码:

 1     public static void modifySon(){
 2         DocumentBuilderFactory dbf=DocumentBuilderFactory.newInstance();
 3         dbf.setIgnoringElementContentWhitespace(true);
 4         try{
 5         
 6             DocumentBuilder db=dbf.newDocumentBuilder();
 7             Document xmldoc=db.parse(xmlPath);
 8         
 9             Element root = xmldoc.getDocumentElement();
10             
11             Element per =(Element) selectSingleNode("/father/son[@id='001']", root);
12             per.getElementsByTagName("age").item(0).setTextContent("27");
13             
14             TransformerFactory factory = TransformerFactory.newInstance();
15             Transformer former = factory.newTransformer();
16             former.transform(new DOMSource(xmldoc), new StreamResult(new File(xmlPath)));
17         }catch(Exception e){
18             e.printStackTrace();
19         }
20     }

  删除XML中的节点

  通过XPath获取目标节点, 进行删除,最后保存

1             Element root = xmldoc.getDocumentElement();
2             
3             Element son =(Element) selectSingleNode("/father/son[@id='002']", root);
4             root.removeChild(son);
5 
6             TransformerFactory factory = TransformerFactory.newInstance();
7             Transformer former = factory.newTransformer();
8             former.transform(new DOMSource(xmldoc), new StreamResult(new File(xmlPath)));

  全部代码:

 1     public static void discardSon(){
 2             
 3         DocumentBuilderFactory dbf=DocumentBuilderFactory.newInstance();
 4         dbf.setIgnoringElementContentWhitespace(true);
 5         
 6         try{
 7         
 8             DocumentBuilder db=dbf.newDocumentBuilder();
 9             Document xmldoc=db.parse(xmlPath);
10         
11             Element root = xmldoc.getDocumentElement();
12             
13             Element son =(Element) selectSingleNode("/father/son[@id='002']", root);
14             root.removeChild(son);
15 
16             TransformerFactory factory = TransformerFactory.newInstance();
17             Transformer former = factory.newTransformer();
18             former.transform(new DOMSource(xmldoc), new StreamResult(new File(xmlPath)));
19             
20         }catch(Exception e){
21             e.printStackTrace();
22         }
23     }

综上,基本XML的操作就如此了。下面是整合所有的代码,可以直接运行的,前提是在src下自己配好Xml文件。

XML

 1 <?xml version="1.0" encoding="UTF-8" standalone="no"?><father>
 2     <son id="001">
 3         <name>老大</name>
 4         <age>27</age>
 5     </son>
 6     <son id="002">
 7         <name>老二</name>
 8         <age>13</age>
 9     </son>
10     <son id="003">
11         <name>老三</name>
12         <age>13</age>
13     </son>
14 </father>

xmlManage.java

  1 package xmlManger;
  2 
  3 import java.io.File;
  4 
  5 import javax.xml.parsers.DocumentBuilder;
  6 import javax.xml.parsers.DocumentBuilderFactory;
  7 import javax.xml.transform.Transformer;
  8 import javax.xml.transform.TransformerFactory;
  9 import javax.xml.transform.dom.DOMSource;
 10 import javax.xml.transform.stream.StreamResult;
 11 import javax.xml.xpath.XPath;
 12 import javax.xml.xpath.XPathConstants;
 13 import javax.xml.xpath.XPathExpressionException;
 14 import javax.xml.xpath.XPathFactory;
 15 
 16 import org.w3c.dom.Document;
 17 import org.w3c.dom.Element;
 18 import org.w3c.dom.Node;
 19 import org.w3c.dom.NodeList;
 20 
 21 
 22 
 23 public class xmlManage {
 24     
 25     private static String xmlPath = "E:\\Eclipse(Plugin)\\workspace\\xmlManger\\src\\family.xml";
 26     
 27     
 28     public static void getFamilyMemebers(){
 29         DocumentBuilderFactory dbf=DocumentBuilderFactory.newInstance();
 30         dbf.setIgnoringElementContentWhitespace(true);
 31         try {
 32             DocumentBuilder db = dbf.newDocumentBuilder();
 33             Document doc = db.parse(xmlPath); // 使用dom解析xml文件
 34 
 35             NodeList sonlist = doc.getElementsByTagName("son"); 
 36             for (int i = 0; i < sonlist.getLength(); i++) // 循环处理对象
 37             {
 38                 Element son = (Element)sonlist.item(i);;
 39                 
 40                 for (Node node = son.getFirstChild(); node != null; node = node.getNextSibling()){  
 41                     if (node.getNodeType() == Node.ELEMENT_NODE){  
 42                         String name = node.getNodeName();  
 43                         String value = node.getFirstChild().getNodeValue();  
 44                         System.out.println(name+" : "+value);
 45                     }  
 46                 }  
 47             }
 48         } catch (Exception e) {
 49             e.printStackTrace();
 50         }
 51     }
 52     
 53     public static void modifySon(){
 54         DocumentBuilderFactory dbf=DocumentBuilderFactory.newInstance();
 55         dbf.setIgnoringElementContentWhitespace(true);
 56         try{
 57         
 58             DocumentBuilder db=dbf.newDocumentBuilder();
 59             Document xmldoc=db.parse(xmlPath);
 60         
 61             Element root = xmldoc.getDocumentElement();
 62             
 63             Element per =(Element) selectSingleNode("/father/son[@id='001']", root);
 64             per.getElementsByTagName("age").item(0).setTextContent("27");
 65             
 66             TransformerFactory factory = TransformerFactory.newInstance();
 67             Transformer former = factory.newTransformer();
 68             former.transform(new DOMSource(xmldoc), new StreamResult(new File(xmlPath)));
 69         }catch(Exception e){
 70             e.printStackTrace();
 71         }
 72     }
 73     
 74     public static void discardSon(){
 75             
 76         DocumentBuilderFactory dbf=DocumentBuilderFactory.newInstance();
 77         dbf.setIgnoringElementContentWhitespace(true);
 78         
 79         try{
 80         
 81             DocumentBuilder db=dbf.newDocumentBuilder();
 82             Document xmldoc=db.parse(xmlPath);
 83         
 84             Element root = xmldoc.getDocumentElement();
 85             
 86             Element son =(Element) selectSingleNode("/father/son[@id='002']", root);
 87             root.removeChild(son);
 88 
 89             TransformerFactory factory = TransformerFactory.newInstance();
 90             Transformer former = factory.newTransformer();
 91             former.transform(new DOMSource(xmldoc), new StreamResult(new File(xmlPath)));
 92             
 93         }catch(Exception e){
 94             e.printStackTrace();
 95         }
 96     }
 97     
 98     public static void createSon() {
 99         DocumentBuilderFactory dbf=DocumentBuilderFactory.newInstance();
100         dbf.setIgnoringElementContentWhitespace(false);
101         
102         try{
103         
104             DocumentBuilder db=dbf.newDocumentBuilder();
105             Document xmldoc=db.parse(xmlPath);
106         
107             Element root = xmldoc.getDocumentElement();
108             
109             //删除指定节点
110             
111             Element son =xmldoc.createElement("son");
112             son.setAttribute("id", "004");
113             
114             Element name = xmldoc.createElement("name");
115             name.setTextContent("小儿子");
116             son.appendChild(name);
117 
118             Element age = xmldoc.createElement("name");
119             age.setTextContent("0");
120             son.appendChild(age);
121             
122             root.appendChild(son);
123             //保存
124             TransformerFactory factory = TransformerFactory.newInstance();
125             Transformer former = factory.newTransformer();
126             former.transform(new DOMSource(xmldoc), new StreamResult(new File(xmlPath)));
127             
128         }catch(Exception e){
129             e.printStackTrace();
130         }
131     }
132     
133     public static Node selectSingleNode(String express, Element source) {
134         Node result=null;
135         XPathFactory xpathFactory=XPathFactory.newInstance();
136         XPath xpath=xpathFactory.newXPath();
137         try {
138             result=(Node) xpath.evaluate(express, source, XPathConstants.NODE);
139         } catch (XPathExpressionException e) {
140             e.printStackTrace();
141         }
142         
143         return result;
144     }
145     
146     public static void main(String[] args){
147         getFamilyMemebers();
148         System.out.println("~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~");
149         modifySon();
150         System.out.println("~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~");
151         getFamilyMemebers();
152         System.out.println("~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~");
153         discardSon();
154         System.out.println("~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~");
155         getFamilyMemebers();
156         System.out.println("~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~");
157         createSon();
158         System.out.println("~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~");
159         getFamilyMemebers();
160     }
161 }

运行结果:

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏Play & Scala 技术分享

Java字符串处理技巧

32050
来自专栏Java帮帮-微信公众号-技术文章全总结

Java基础-21(01)总结字符流,IO流编码问题,实用案例必做一遍

1:字符流(掌握) // 字节流读取中文可能出现的小问题(所以用字符流输入输出中文) package cn.itcast_01; import java.io...

34940
来自专栏李家的小酒馆

Java IO(IO流)-2

IO流 第一部分 (OutputStreamWriter BufferOutputStream) 转换流 超类为Reader和Writer 是字符流通向字节流的...

20600
来自专栏用户2442861的专栏

java IO流之四 使用转换流InputStreamReader和OutputStreamWriter

http://blog.csdn.net/a107494639/article/details/7586744

24910
来自专栏cs

java对文件的操作如下

12020
来自专栏xingoo, 一个梦想做发明家的程序员

Java程序员的日常—— IOUtils总结

以前写文件的复制很麻烦,需要各种输入流,然后读取line,输出到输出流...其实apache.commons.io里面提供了输入流输出流的常用工具方法,非常方...

63290
来自专栏java架构师

Android一 流

补充Java知识:流 java.io 四个抽象类: 字节流:InputStream OutputStream 字符流:Reader Writer 站在程序角度上...

361110
来自专栏机器学习实践二三事

java IO体系

IO流 Java中IO流分为两种,字节流和字符流,顾名思义字节流就是按照字节来读取和写入的,字符刘是按照字符来存取的;常用的文件读取用的就是字符流,在网络通信里...

23070
来自专栏noteless

[十八]JavaIO之FileReader 和 FileWriter

FileReader 和 FileWriter继承了InputStreamReader 和OutputStreamWriter

13410
来自专栏待你如初见

JavaIO流输入输出流-字符流

14710

扫码关注云+社区

领取腾讯云代金券