07
08

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 







为了答谢大家对蜗牛学院的支持,蜗牛学院将会定期对大家免费发放干货,敬请关注蜗牛学院的官方微信。



20181009_153045_341.jpg


版权所有,转载本站文章请注明出处:蜗牛学苑, https://www.woniuxy.cn/article/163