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. python函数把可变数据类型当默认参数值的问题(转)

    add by zhj: 文章写的很好,其实只要默认参数在函数中只读不写,那默认值就不会被修改,可变类型做默认参数就不会有问题 方法二中,当result is None时,修改result的指向,不再指 ...

  2. 查看虚拟机里的Centos7的IP

    这里之所以是查看下IP ,是我们后面要建一个Centos远程工具Xshell 连接Centos的时候,需要IP地址,所以我们这里先 学会查看虚拟机里的Centos7的IP地址 首先我们登录操作系统 用 ...

  3. MSSQL2008 数据库展开报错:值不能为空。 参数名: viewInfo (Microsoft.SqlServer.Management.SqlStudio.Explorer)

    今天打开数据库,结果出现:值不能为空. 参数名: viewInfo (Microsoft.SqlServer.Management.SqlStudio.Explorer) 百度之后找到其中一种解决方案 ...

  4. zabbix源码安装实例

    环境 系统                 Centos7 zabbix版本      Zabbix 3.4.15 (revision 86739) zabbix源码安装 .tar.gz cd zab ...

  5. jQuery toastr提示简单实现

    注:在学校平时做的小项目跳页都是用 Response.Write写脚本弹窗并跳页,每次点击登录成功,注册成功......然后点击确定,太麻烦了,这次的项目老师说让用这个插件,所以就简单搞了一下! 实现 ...

  6. subprocess.CalledProcessError: Command ‘(‘lsb_release’, ‘-a’)’ returned non-zero exit status 1.

    解决方法find / -name lsb_releaserm -rf /usr/bin/lsb_release

  7. JAVA反射机制及理解

    JAVA反射 往往当我们面对一项新的知识时,我们往往需要知道三个方面,它是什么,它能做什么,它比原有知识强在哪里,我们该怎么使用它.当你能够解决这些问题时,便意味着你已经对这项知识入门了. 首先: 反 ...

  8. selenium--鼠标事件

    鼠标事件perform() #执行所有ActionChains中存储的行为context_click() #右击事件double_click() #双击事件drag_and_drop(source,t ...

  9. UML作业第一次:UML用例图绘制

    UML第一次作业 一. 用例图:用例图(usecase diagram)是UML用于描述软件功能的图形.用例图包括用例.参与者及其关系,用例图也可以包括注释和约束.程序员要画时序图啥的用其他的比较麻烦 ...

  10. PHP----------PHP自身的性能优化注意事项

    1.如果能将类的方法定义成static,就尽量定义成static,它的速度会提升将近4倍. 2.$row[’id’] 的速度是$row[id]的7倍. 3.echo 比 print 快,并且使用ech ...