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. mysql自动更新时间

    ALTER TABLE sys_user MODIFY COLUMN update_time TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDAT ...

  2. 常用Java技术社区

      Java生态圈知识链: 求职平台 阿里巴巴社招平台 杭州网易社招平台 微店社招平台 银联社招平台 百度社招平台 Java生态圈知识链: 个人优秀博客 腾讯_运维工程师_刘天斯 阿里_Android ...

  3. vue js实现获取两个日期之间所有日期

    https://blog.csdn.net/m0_37852904/article/details/85790793 // 计算续住的总日期列表 getAll(begin, end) { let ar ...

  4. 关于11G DataGuard 日志传输的案例

    案例探讨 在归档和非归档模式下,配置参数log_archive_dest_2后,DG的备库是否传输日志. 案例环境描述 本次环境如下,一套RAC+单机DG,然后从DG还原出来一个单独的测试库A,测试库 ...

  5. 学习DButils笔记

    DBUtills: *********************** 1:创建对象:QueryRunner的对象,其中创建的方式有两种: ①QueryRunner qr = new QueryRunne ...

  6. logback日志丢失的情况之一

    在游戏服务器上线之后,会记录很多统计日志,这些日志是第三方需要的数据,通过linux 的 rsync方式同步给第三方.日志规则 每十分钟会创建一个日志文件.然后后台有一个rsync进程,每隔十分钟向第 ...

  7. luogu P1003 铺地毯

    水题 #include<stdio.h> #include<string.h> #include<algorithm> using namespace std; t ...

  8. 寻找U2OS中表达的基因及其promoter并用于后续annotation

    方法1.RNA-seq得到不同表达程度基因 方法2. 直接download U2OS_gene.csv https://cancer.sanger.ac.uk/cell_lines/download ...

  9. MyBatis探究-----返回Map类型数据

    1.使用@MapKey @MapKey:告诉mybatis封装Map的时候使用哪个属性作为Map的key Map<K, V>:键是这条记录的主键key,值是记录封装后的javaBean 1 ...

  10. python学习笔记之paramiko和sqlalchemy (第九天)

    参考银角大王 :http://www.cnblogs.com/wupeiqi/articles/5095821.html http://www.cnblogs.com/wupeiqi/articles ...