XML是一个可扩展标记语言。很多时候我们需要进行数据交换,同时也存在跨平台使用,XML文件对这些需求提供了很好的帮助!

  对于Java来说,XML常见的用途就是保存数据和配置,这就涉及了对XML文件的增删改查操作!

  Java常见的XML解析方式分为DOM解析、SAX解析、DOM4j解析,下面是这三种解析方式的优缺点:

  1、DOM解析

  方便遍历,随机访问某一个节点,修改XML。缺点是一次性读取到内存。

  2、SAX解析

  从上至下一个个节点去解析,触发事件(调用相应的方法)来进行处理。不能对xml进行修改。占用内存小。

  3、DOM4j

  第三方的开源的解析工具,方便使用。

XML文件:(src/name.xml)

 <?xml version="1.0" encoding="UTF-8" standalone="no"?>
<names>
<name id="张三">
<age>20</age>
</name>
<name id="李四">
<age>25</age>
</name>
<name id="王五">
<age>30</age>
</name>
</names>

  下面我就来介绍DOM和DOM4j来解析上面的XML文件的方法:

DOM解析:

 import java.io.IOException;

 import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;
import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerConfigurationException;
import javax.xml.transform.TransformerException;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.dom.DOMSource;
import javax.xml.transform.stream.StreamResult; import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
import org.xml.sax.SAXException; public class DOM { public static void main(String[] args) {
// TODO Auto-generated method stub
try {
DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
// 创建DOM解析器工厂
DocumentBuilder db = dbf.newDocumentBuilder();
// 调用DOM解析器工厂的newDocumentBuilder()方法得到DOM解析器对象
Document doc = db.parse("src\\name.xml");
// 调用DOM解析器对象parse(String uri)方法得到Document对象
NodeList nl = doc.getElementsByTagName("name");
// 调用Document对象的getElementsByTagName(String tagname)方法得到NodeList对象
/*
* 遍历XML中的元素
*/
for (int i = 0; i < nl.getLength(); i++) {
Node node = nl.item(i);
// 通过NodeList的item(int index)方法得到NodeList中的Node对象
Element element = (Element) node;
// 通过Node对象强制转换的方法得到Element对象
String id = element.getAttribute("id");
// 通过Element对象的getgetAttribute(String name)方法得到id属性值
System.out.println(id);
// 打印id属性值
String age = element.getElementsByTagName("age").item(0).getTextContent();
// 通过Element对象的getElementsByTagName(String name)方法得到age的属性值
System.out.println(age);
// 打印age
}
/*
* 添加元素到XML中
*/
Element root = doc.getDocumentElement();
// 通过Document对象的getDocumentElement()方法得到根节点
Element newname = doc.createElement("name");
// 通过Document对象的createElement(String tagName)方法得到新的name元素
newname.setAttribute("id", "小明");
// 通过调用Element对象的setAttribute(String name,String value)方法为id赋值
Element newage = doc.createElement("age");
// 通过Document对象的createElement(String tagName)方法得到新的age元素
newage.setTextContent("18");
// 通过调用Element对象的setTextContent(String textContent)方法为age赋值
newname.appendChild(newage);
// 添加age到name中
root.appendChild(newname);
// 添加name到根节点中
/*
* 修改XML中的元素
*/
for (int i = 0; i < nl.getLength(); i++) {
Element fixname = (Element) nl.item(i);
// 得到要修改的Element对象
String fixnewname = fixname.getAttribute("id");
// 获取到要修改对象的id属性值
/*
* 判断name是否为要修改的对象
*/
if (fixnewname.equals("小明")) {
Element sex = doc.createElement("sex");
// 创建新的Element对象
sex.setAttribute("sex", "男");
// 给新的Element对象的属性赋值
fixname.appendChild(sex);
// 添加新的Element(sex)对象到Element(fixname)对象中
}
}
/*
* 删除XML中的元素
*/
root.removeChild(root.getChildNodes().item(7));
// 首先通过根节点访问子节点,得到Node对象,然后调用根节点的removeChild(Node oldChild)方法删除元素
/*
* 将更改写入到XML文件中
*/
TransformerFactory tf = TransformerFactory.newInstance();
// 调用TransformerFactory的newInstance()方法得到TransformerFactory对象
Transformer t = tf.newTransformer();
// 调用TransformerFactory对象的newTransformer()方法得到Transformer对象
t.transform(new DOMSource(doc), new StreamResult("src\\name.xml"));
// 调用Transformer对象的transform(Source xmlSource,Result
// outputTarget)方法将修改写入到name.xml文件中
} catch (ParserConfigurationException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (SAXException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (TransformerConfigurationException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (TransformerException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
} }

遍历运行结果:

 张三
20
李四
25
王五
30

添加运行结果:

 <?xml version="1.0" encoding="UTF-8" standalone="no"?>
<names>
<name id="张三">
<age>20</age>
</name>
<name id="李四">
<age>25</age>
</name>
<name id="王五">
<age>30</age>
</name>
<name id="小明">
<age>18</age>
</name>
</names>

修改运行结果:

 <?xml version="1.0" encoding="UTF-8" standalone="no"?>
<names>
<name id="张三">
<age>20</age>
</name>
<name id="李四">
<age>25</age>
</name>
<name id="王五">
<age>30</age>
</name>
<name id="小明">
<age>18</age>
<sex sex="男" />
</name>
</names>

删除运行结果:

 <?xml version="1.0" encoding="UTF-8" standalone="no"?>
<names>
<name id="张三">
<age>20</age>
</name>
<name id="李四">
<age>25</age>
</name>
<name id="王五">
<age>30</age>
</name>
</names>

DOM4j解析:

使用DOM4j解析需要添加第三方工具包,具体网址:DOM4j

 import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.Element;
import org.dom4j.io.SAXReader;
import org.dom4j.io.XMLWriter; import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.UnsupportedEncodingException;
import java.util.List; public class DOM4j { public static void main(String[] args) {
// TODO Auto-generated method stub
try {
// 遍历
SAXReader sr = new SAXReader();
Document doc = sr.read("src\\name.xml");
Element root = doc.getRootElement();
List<Element> name = root.elements("name");
for (Element names : name) {
System.out.println(names.attributeValue("id"));
List<Element> age = names.elements("age");
for (Element ages : age) {
System.out.println(ages.getText());
}
}
// 添加
Element newname = root.addElement("name");
newname.addAttribute("id", "小明");
Element newage = newname.addElement("age");
newage.setText("18");
//删除
root.remove(name.get(3));
// 写入
XMLWriter xw = new XMLWriter(new FileOutputStream("src\\name.xml"));
xw.write(doc);
} catch (DocumentException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (UnsupportedEncodingException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
} }

运行结果上同。

随机推荐

  1. js 删除确定

    "<td><a href='shanchu.php?c={$v[0]}' onclick=\"return confirm('确定删除么?')\"> ...

  2. OVM-V1.2 版发布,新增实时监控、支持一键升级

    OVM是国内首款.完全免费.企业级--混合虚拟化管理平台,OVM是从中小企业目前的困境得到启发,完全基于国内企业特点开发,更多的关注国内中小企业用户的产品需求. OVM-V1.2 该版本功能变动如下: ...

  3. POJ 1797 Heavy Transportation

    题目链接:http://poj.org/problem?id=1797 Heavy Transportation Time Limit: 3000MS   Memory Limit: 30000K T ...

  4. MariaDB10.2.X-新特性1-支持分析函数

    前言:前段时间看到MariaDB10.2出测试版本了,心想有什么新特性玩玩,大家都知道MySQL不支持分析函数,但是MariaDB10.2.X支持分析函数了, 1.表结构 CREATE TABLE ` ...

  5. Struts2 动态调用方法

    struts2动态调用方法有两种方式 方式一:用通配符进行调用: Action方法: package com.bjyinfu.struts.actions; public class CatchDyn ...

  6. log4j实时将数据写入到kafka,Demo和相关的配置详解

    一:在项目中引入对应的JAR包,如下,注意对应的包与之前包的冲突 <dependencies> <dependency> <groupId>junit</gr ...

  7. 上线---苹果AppStore审核注意事项,Guideline 1.2 - Safety - User Generated Content,2.1等条例(苹果审核六次拒绝)

    前段时间上线app,和战友一起撸了那么久的代码,上线是最激动的.然而安卓各大平台上线了半个月了,苹果却给了六次拒绝. 刚开始等苹果等的焦头烂额,现在内心毫无波澜,目前还在审核中...... 六次的拒绝 ...

  8. linux下uptime命令详解

    uptime uptime 另外还有一个参数 -V(大写),是用来查询版本的 procps是一个实用程序包,主要包括ps top kill等程序主要用来显示与控制一些系统信息,进程状态之类的内容. 以 ...

  9. relativeURL 相对URL的坑

    我正在尝试实现一个使用RestKit的iOS应用程序.在我迄今为止看到的所有示例中,以下代码用于创建URL: NSURL *baseURL = [NSURL URLWithString:@" ...

  10. linux下mysql操作命令集合

    转载:http://www.cnblogs.com/xiaochaohuashengmi/archive/2011/10/18/2216279.html 1.linux下启动mysql的命令:mysq ...