XML是⼀个可扩展标记语⾔。很多时候我们需要进⾏数据交换,同时也存在跨平台使⽤,XML⽂件对这些需求提供了很好的帮助! 对于Java来说,XML常见的⽤途就是保存数据和配置,这就涉及了对XML⽂件的增删改查操作!
Java常见的XML解析⽅式分为DOM解析、SAX解析、DOM4j解析,下⾯是这三种解析⽅式的优缺点: 1、DOM解析
⽅便遍历,随机访问某⼀个节点,修改XML。缺点是⼀次性读取到内存。 2、SAX解析
从上⾄下⼀个个节点去解析,触发事件(调⽤相应的⽅法)来进⾏处理。不能对xml进⾏修改。占⽤内存⼩。 3、DOM4j
第三⽅的开源的解析⼯具,⽅便使⽤。XML⽂件:(src/name.xml)
1 2 3 6 9
下⾯我就来介绍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,Result100 // outputTarget)⽅法将修改写⼊到name.xml⽂件中101 } catch (ParserConfigurationException e) {102 // TODO Auto-generated catch block103 e.printStackTrace();104 } catch (SAXException e) {
105 // TODO Auto-generated catch block106 e.printStackTrace();107 } catch (IOException e) {
108 // TODO Auto-generated catch block109 e.printStackTrace();
110 } catch (TransformerConfigurationException e) {111 // TODO Auto-generated catch block112 e.printStackTrace();
113 } catch (TransformerException e) {
114 // TODO Auto-generated catch block115 e.printStackTrace();116 }117 }118 119 }
遍历运⾏结果:
1 张三2 203 李四4 255 王五6 30
添加运⾏结果:
1 2 3 6 9 12
修改运⾏结果:
1 2 3 6 9 12
删除运⾏结果:
1 2 3 6 9
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 stub17 try {
18 // 遍历
19 SAXReader sr = new SAXReader();
20 Document doc = sr.read(\"src\\\\name.xml\");21 Element root = doc.getRootElement();
22 List 24 System.out.println(names.attributeValue(\"id\"));25 List 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 block42 e.printStackTrace(); 43 } catch (UnsupportedEncodingException e) {44 // TODO Auto-generated catch block45 e.printStackTrace(); 46 } catch (FileNotFoundException e) {47 // TODO Auto-generated catch block48 e.printStackTrace();49 } catch (IOException e) { 50 // TODO Auto-generated catch block51 e.printStackTrace();52 }53 }54 55 } 运⾏结果上同。 因篇幅问题不能全部显示,请点此查看更多更全内容