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();
}
} }

运行结果上同。

Java解析XML文件的常用方法介绍的更多相关文章

  1. java解析xml文件并输出

    使用java解析xml文件,通过dom4j,代码运行前需先导入dom4j架包. ParseXml类代码如下: import java.io.File; import java.util.ArrayLi ...

  2. 使用Java解析XML文件或XML字符串的例子

    转: 使用Java解析XML文件或XML字符串的例子 2017年09月16日 11:36:18 inter_peng 阅读数:4561 标签: JavaXML-Parserdom4j 更多 个人分类: ...

  3. Java解析xml文件遇到特殊符号&会出现异常的解决方案

    文/朱季谦 在一次Java解析xml文件的开发过程中,使用SAX解析时,出现了这样一个异常信息: Error on line 60 of document : 对实体 "xxx" ...

  4. java解析XML文件

    dom4j是一个Java的XML API,类似于jdom,用来读写XML文件的.dom4j是一个非常非常优秀的Java XML API,具有性能优异.功能强大和极端易用使用的特点,同时它也是一个开放源 ...

  5. JAVA解析XML文件(DOM,SAX,JDOM,DOM4j附代码实现)

    1.解析XML主要有四种方式 1.DOM方式解析XML(与平台无关,JAVA提供,一次性加载XML文件内容,形成树结构,不适用于大文件) 2.SAX方式解析XML(基于事件驱动,逐条解析,适用于只处理 ...

  6. Java解析XML文件的方式

    在项目里,我们往往会把一些配置信息放到xml文件里,或者各部门间会通过xml文件来交换业务数据,所以有时候我们会遇到“解析xml文件”的需求.一般来讲,有基于DOM树和SAX的两种解析xml文件的方式 ...

  7. java 解析xml文件案例

    package xmlTest; import javax.xml.parsers.*; import org.w3c.dom.*; public class GetXml { public stat ...

  8. 关于java解析xml文件出现的问题

    DOM解析xml文件 问题1:导入javax.xml.parsers.DocumentBuilderFactory出现问题,如图: 解决办法是:由于创建工程时有个默认的jre,重新创建工程改掉就解决了 ...

  9. java解析XML文件四种方法之引入源文件

    1.DOM解析(官方) try { DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();         Documen ...

随机推荐

  1. jedis & common pool

    http://mvnrepository.com/artifact/redis.clients/jedis http://mvnrepository.com/artifact/org.apache.c ...

  2. 【转】Java遍历Map对象的四种方式

    关于java中遍历map具体哪四种方式,请看下文详解吧. 方式一 这是最常见的并且在大多数情况下也是最可取的遍历方式.在键值都需要时使用. Map<Integer, Integer> ma ...

  3. PHP多线程 curl_multi_init 的使用

    php中可以通过CURL处理HTTP请求,其中curl_init()是单线程模式,如果需要对事务处理走多线程模式,那么就需要用到curl_multi_init()函数. 本案例用来测试大并发的情况下 ...

  4. 20175211 2017-2018-2 《Java程序设计》第六周学习记录(2)

    目录 1.File类 2.FilenameFilter接口 3.输入输出流 4.使用Scanner解析文件 参考资料 <Java 2实用教程>第10章 输入.输出流 1.File类 常用方 ...

  5. curl 支持 http2

    让 curl 支持 HTTP2 我们需要安装 nghttp2(http2 的 C 语言库) 源码安装 安装 nghttp2 git clone https://github.com/tatsuhiro ...

  6. Failed to set MokListRT: Invalid Parameter Something as gone seriously wrong: import_mok_state() failed: Invalid Parameter

    今天yum update升级centos7,重启后发现开不了机,报错如下: Failed to set MokListRT: Invalid ParameterSomething as gone se ...

  7. 获取Type的三种方式

    using System;using UnityEngine; public class Type_Test : MonoBehaviour{    private void Awake()    { ...

  8. SSM框架和SSH框架的区别

    SSH和SSM定义 SSH 通常指的是 Struts2 做控制器(controller),spring 管理各层的组件,hibernate 负责持久化层. SSM 则指的是 SpringMVC 做控制 ...

  9. MySQL根据出生日期计算年龄

    以前使用mysql不是很多,对mysql的函数也不是很熟悉,遇到这个问题第一时间百度搜索,搜索到这两种方法,这两种方法是排在百度第一条的博客. 方法一 SELECT DATE_FORMAT(FROM_ ...

  10. [BZ4923][Lydsy1706月赛]K小值查询

    K小值查询 题面 维护一个长度为n的正整数序列a_1,a_2,...,a_n,支持以下两种操作: 1 k,将序列a从小到大排序,输出a_k的值. 2 k,将所有严格大于k的数a_i减去k. Input ...