Java数据持久化->XML文件(二)
在上述代码中,我们引入了一个新的知识点:Xpath,XPath即为XML路径语言,它是一种用来确定XML(标准通用标记语言的子集)文档中某部分位置的语言。XPath基于XML的树状结构,提供在数据结构树中找寻节点的能力。 同样的,Xpath的寻找节点的功能也适用于对HTML文档进行查找。后续我们在使用Selenium对HTML文档元素进行查找时也会用到。
注:本节教材内容,与上期推送的《预备知识:Java数据持久化->XML文件(一)》为一个章节。
回顾上节内容,请点击:预备知识:Java数据持久化->XML文件(一)
实验流程
4.利用DOM修改XML。
public void modifyXmlByDom() { DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance(); dbf.setIgnoringElementContentWhitespace(true); String xmlName = System.getProperty("user.dir") + "\\data\\Students.xml"; try { DocumentBuilder db = dbf.newDocumentBuilder(); Document doc = db.parse(xmlName); // 获取根节点 Element root = doc.getDocumentElement(); // 利用xpath定位sequence为2的节点 XPathFactory xpathFactory = XPathFactory.newInstance(); XPath xpath = xpathFactory.newXPath(); Element node = (Element)xpath.evaluate( "/class/student[@sequence='2']", root, XPathConstants.NODE); // 将degree节点的内容更改为研究生 node.getElementsByTagName("degree").item(0).setTextContent("研究生"); // 保存 TransformerFactory factory = TransformerFactory.newInstance(); Transformer former = factory.newTransformer(); former.transform(new DOMSource(doc), new StreamResult( new File(xmlName))); } catch (Exception e) { System.out.println(e.getMessage()); } } |
在上述代码中,我们引入了一个新的知识点:Xpath,XPath即为XML路径语言,它是一种用来确定XML(标准通用标记语言的子集)文档中某部分位置的语言。XPath基于XML的树状结构,提供在数据结构树中找寻节点的能力。
同样的,Xpath的寻找节点的功能也适用于对HTML文档进行查找。后续我们在使用Selenium对HTML文档元素进行查找时也会用到。
5.利用DOM删除XML。
// 与修改节点内容类似,只需要对查找到的节点进行删除即可 root.removeChild(node); |
上述代码只是简单地为大家展示了如何使用标准的DOM接口来完成XML文件的增删改查的操作,事实上DOM接口是W3C定义的标准接口,任何编程语言都可以支持。除了上述代码以外,我们在实际应用中,还会基于具体的业务需要进行二次封装,使调用更加方便,增强代码的重用性。
6.利用DOM4J操作XML文件。
要利用Dom4J来操作XML文件,我们必须首先在项目中导入dom4j.jar,jaxen-full.jar和saxpath-dev_orbeon.jar文件(下载网址:http://www.manyjar.com/)
package com.woniuxy.java.io; import java.io.*; import java.util.Iterator; import java.util.List; import org.dom4j.Document; import org.dom4j.DocumentHelper; import org.dom4j.Element; import org.dom4j.io.OutputFormat; import org.dom4j.io.SAXReader; import org.dom4j.io.XMLWriter; public class Dom4JReadWrite { String xmlFile = System.getProperty("user.dir") + "\\data\\Students.xml"; String xmlFile2 = System.getProperty("user.dir") + "\\data\\Person.xml"; public static void main(String[] args) { Dom4JReadWrite d4j = new Dom4JReadWrite(); // d4j.readXml(); // d4j.createXml(); // d4j.modifyXml(); // d4j.deleteXml(); } // 打开XML文档 public Document getDocument(String fileName) { SAXReader sr = new SAXReader(); org.dom4j.Document doc = null; try { doc = sr.read(new File(fileName)); } catch (Exception e) { e.printStackTrace(); } return doc; } // 保存XML文档的修改 public void writeToFile(Document doc, String fileName) { try { Writer writer = new FileWriter(fileName); OutputFormat format = OutputFormat.createPrettyPrint(); format.setEncoding("UTF-8"); XMLWriter xmlWriter = new XMLWriter(writer, format); xmlWriter.write(doc); xmlWriter.close(); System.out.println("文件写入成功."); } catch (Exception e) { e.printStackTrace(); } } // 读取XML文档内容 public void readXml() { Document doc = getDocument(xmlFile); List nameList = doc.selectNodes("/class/student/name"); List ageList = doc.selectNodes("/class/student/age"); List sexList = doc.selectNodes("/class/student/sex"); for (int i = 0; i < nameList.size(); i++) { String name = ((Element) nameList.get(i)).getTextTrim(); System.out.println("name = " + name); String age = ((Element) ageList.get(i)).getTextTrim(); System.out.println("age = " + age); String sex = ((Element) sexList.get(i)).getTextTrim(); System.out.println("sex = " + sex); System.out.println("======================="); } } // 新建XML文档 public void createXml() { Element root = DocumentHelper.createElement("Person"); Document document = DocumentHelper.createDocument(root); // 给根节点添加属性 root.addAttribute("学校", "南大").addAttribute("位置", "江西"); // 给根节点添加孩子节点 Element element1 = root.addElement("学生"); element1.addElement("姓名").addAttribute("婚姻", "单身") .addText("小章"); element1.addElement("年龄").addText("21"); Element element2 = root.addElement("学生"); element2.addElement("姓名").addAttribute("婚姻", "单身") .addText("小红").addElement("爱好").addText("唱歌"); element2.addElement("年龄").addText("22"); // 把生成的xml文档存放在硬盘上, true代表是否换行, " "代表缩进 OutputFormat format = new OutputFormat(" ", true); format.setEncoding("UTF-8");// 设置编码格式 try { XMLWriter xmlWriter = new XMLWriter( new FileOutputStream(xmlFile2), format); xmlWriter.write(document); xmlWriter.close(); } catch (Exception e) { e.printStackTrace(); } } // 修改XML文档 - 通过name查找 public void modifyXml() { String name = "何国学"; // 通过姓名查找是否存在此节点 String key = "degree"; // 修改何国学的学历 字段 String value = "研究生"; // 修改后的新值 Document doc = getDocument(xmlFile); List nameList = doc.selectNodes("/class/student/name"); Iterator iterator = nameList.iterator(); while (iterator.hasNext()) { Element element = (Element) iterator.next(); if (name != null && name.equals(element.getText())) { Element pe = element.getParent(); List childList = pe.elements(); for (int i = 0; i < childList.size(); i++) { String nodeName = ((Element) childList.get(i)).getName(); if (key != null && key.equals(nodeName)) { ((Element) childList.get(i)).setText(value); } } } } // 将修改写入文件中 this.writeToFile(doc, xmlFile); } // 删除或修改指定节点 public void deleteXml() { try { SAXReader reader = new SAXReader(); Document doc = reader.read(new File(xmlFile2)); // 获取节点的两种方式 Element node = doc.getRootElement().element("学生").element("姓名"); // Element node = (Element)doc.selectSingleNode("/Person/学生/姓名/爱好"); //删除节点 node.getParent().remove(node); // 也可以通过此方式对节点进行更新 // Element node = document.getRootElement().element("学生").element("姓名"); // node.setText("张三"); // 另外一种 this.writeToFile(doc, xmlFile2); } catch (Exception e) { } } } |
思考练习
1.自学使用JDOM和SAX来处理XML文件。
2.XML文件其实本质上就是一个文本文件,我们也可以利用文件读写方式自己完成。
3.关于Dom, SAX,Dom4J,Jdom的区别及关系,请参考:
http://blog.csdn.net/shijinupc/article/details/7653945或
http://zhang-zling.iteye.com/blog/1047984