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 }