使用jdk DOM,SAX和第三方jar包DOM4J创建,解析xml文件

xml的创建,解析

  • 1. 什么是xml文件
    • 1.1 什么是xml文件
    • 1.2 解析xml的方式,优缺点
  • 2. 使用dom操作xml文件
    • 2.1 使用dom创建xml文件
    • 2.2 使用dom解析xml文件
    • 2.3 使用dom对xml文件增删改
  • 3. 使用SAX解析xml文件
  • 4. 使用DOM4J操作xml文件
    • 4.1 使用DOM4J创建xml文件
    • 4.2 使用DOM4J解析xml文件

1. 什么是xml文件

1.1 什么是xml文件

可标记的扩展语言(文本文件) 类似html文件,xml标签有头有尾部。可读性高。
xml的实际用途:
1.数据存储和传递的媒介
2.作为配置文件

  • XML中的相关概念(叫法)
  • 按级别来分
    a:根节点(有且只能有一个)
    b:父节点
    c:子节点
    d:兄弟节点
  • 按类型来分
    a:元素节点
    b:属性节点
    c:文本节点
  • 如下就是一个xml文件

1.2 解析xml的方式,优缺点

  • 使用Java操作xml文件,有DOM和SAX
  • 优缺点比较

DOM的特点:

  1. 在操作xml文档时需要将整个文档加载到内存,操作灵活方便,但对内存消耗过大
  2. 功能齐全,能创建/解析xml文档,能删除/添加/修改节点信息
    SAX的特点:(事件驱动模式)
  3. 在操作xml文档时是从上到下来加载xml,操作没有dom那么灵活,但内存消耗较dom要小
  4. 功能没有dom齐全,只能创建/解析xml

dom4j:

  1. 集dom和sax的特点于一起
  2. 功能更强大

2. 使用dom操作xml文件

2.1 使用dom创建xml文件

  • 下面创建了person.xml 和 stu.xml
  • 直接用排版印刷怼 和 封装好排版和印刷
package test;import java.io.File;import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.transform.Transformer;
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.NodeList;/*** * @author echo lovely* * dom模式下的* 		xml文件的解析,读取,增删改* * 		优缺点:* 			1. 消耗内存大,把整个xml读到内存,适合数据少的读取* 			2. 灵活,可对整个xml文档进行操作,操作父子,兄弟,第一个,最后一个结点* * 		排版:* 			DocumentBuliderFactory BuilderFactory Document* * 		印刷:* 			TransformerFactory Transformer transfome*  */
public class DocumentXMLNode {public static void main(String[] args) throws Exception {// createNew();// parserXML();// DOMAddXML();// DOMUpdateXML();DOMDeleteXML();}// one by onestatic void createXML() throws Exception {// 创建一个排版工厂DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();	// 创建一个排版机器DocumentBuilder db = factory.newDocumentBuilder();// 准备好空白文档,准备排版Document doc = db.newDocument();// 创建根节点Element root = doc.createElement("Student");// 把根结点挂载到文档中doc.appendChild(root);for (int i = 0; i < 3; i ++) {// 创建stu结点Element stu = doc.createElement("stu" + (i + 1));// 把元素结点添加到stu结点下root.appendChild(stu);// 设置element的属性stu.setAttribute("id",(i + 1) + "");// 创建学生的姓名结点Element name = doc.createElement("name");name.setTextContent("小明" + i);stu.appendChild(name);// 学生的年龄结点Element age = doc.createElement("age");age.setTextContent("" + (18 + i));stu.appendChild(age);}// 印刷// 创建印刷工场TransformerFactory tff = TransformerFactory.newInstance();// 印刷机器Transformer tf = tff.newTransformer();// 开始印刷// 创建xml数据源DOMSource source = new DOMSource(doc);// 确定输出位置StreamResult res = new StreamResult("stu.xml");tf.transform(source, res);		}// 排版 or 解析static Document DOMComposing(String path) throws Exception {// 排版工场DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();// 排版机器DocumentBuilder db = dbf.newDocumentBuilder();Document doc = null;// 空白文档,准备排版if (path == "" || path == null)doc = db.newDocument();else doc = db.parse(path); // 解析xmlreturn doc;}/*** @param doc 排版文档* @param xml文件输出路径* @throws Exception */static void DOMPrinting(Document doc, String outputPath) throws Exception {// 排版工场TransformerFactory tff = TransformerFactory.newInstance();// 排版机器Transformer tf = tff.newTransformer();// 数据源DOMSource xmlSource = new DOMSource(doc);// 输出地址,开始排版 file:/// 中文路径乱码StreamResult res = new StreamResult(new File(outputPath));tf.transform(xmlSource, res);}// hide difficultiesstatic void createNew() {try {Document doc = DOMComposing("");Element root = doc.createElement("person");doc.appendChild(root);for (int i = 0; i < 3; i ++) {Element teacher = doc.createElement("teacher");teacher.setAttribute("id", "" + (i + 1));root.appendChild(teacher);Element name = doc.createElement("name");// 设置name结点的文本内容name.setTextContent("cici" + (i + 1));Element age = doc.createElement("age");age.setTextContent((24 + i) + "");// 把姓名和年龄添加到teacher结点teacher.appendChild(name);teacher.appendChild(age);}DOMPrinting(doc, "person.xml");} catch (Exception e) {e.printStackTrace();}}static void parserXML() throws Exception {// 排版解析DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();DocumentBuilder db = dbf.newDocumentBuilder();// 解析xmlDocument doc = db.parse(new File("stu.xml"));// Element root = (Element) doc.getFirstChild();Element root = doc.getDocumentElement();NodeList nodes = root.getChildNodes();System.out.println(nodes.item(0));for (int i = 0; i < nodes.getLength(); i++) {Element stu = (Element) nodes.item(i);String text = nodes.item(i).getFirstChild().getTextContent();System.out.println(stu.getAttribute("id") + "\t" + text);}}
}
  • element获取结点的其它方式
		Element root = doc.getDocumentElement();root.getFirstChild();//获得当前节点第一个子节点root.getLastChild();//获得当前节点最后一个子节点root.getNextSibling();//获得当前节点下一个兄弟节点root.getPreviousSibling();//获得当前节点上一个兄弟节点root.getParentNode();//获得当前节点父节点

2.2 使用dom解析xml文件

  • 对books.xml解析
	static void domParse() {Document doc = docComposing("books.xml");Element root = (Element) doc.getFirstChild();NodeList list = root.getChildNodes();for (int i = 0; i < list.getLength(); i++) {Element book = (Element) list.item(i);System.out.println(book.getAttribute("id") + "\t" + book.getTextContent());}}/**
1001	java
1002	c#
*/

2.3 使用dom对xml文件增删改

  • 如图
	static void DOMAddXML() {try {Document doc = DOMComposing("person.xml");// 得到第二个name结点下面的第一个结点Element name = (Element) doc.getFirstChild().getFirstChild().getNextSibling().getFirstChild();// System.out.println(name.getTextContent() + "--" + name.getAttribute("id"));// 创建gender结点Element gender = doc.createElement("gender");name.getParentNode().appendChild(gender);gender.setTextContent("female");DOMPrinting(doc, "person.xml");} catch (Exception e) {e.printStackTrace();}}static void DOMUpdateXML() {try {Document doc = DOMComposing("person.xml");doc.getDocumentElement().getLastChild().setTextContent("null");DOMPrinting(doc, "person.xml");} catch (Exception e) {// TODO Auto-generated catch blocke.printStackTrace();}}static void DOMDeleteXML() {try {Document doc = DOMComposing("person.xml");Element beRemoved = (Element) doc.getDocumentElement().getLastChild();beRemoved.getParentNode().removeChild(beRemoved);DOMPrinting(doc, "person.xml");} catch (Exception e) {// TODO Auto-generated catch blocke.printStackTrace();}}

3. 使用SAX解析xml文件

  • 继承DefaultHander类
package test;import java.util.ArrayList;import org.xml.sax.Attributes;
import org.xml.sax.SAXException;
import org.xml.sax.helpers.DefaultHandler;import entity.Person;public class MyDefaultHandler extends DefaultHandler {private ArrayList<Person> list;private Person p;private String tagName;// 重写public MyDefaultHandler(ArrayList<Person> list) {this.list = list;}@Overridepublic void startDocument() throws SAXException {System.out.println("解析根节点");}@Overridepublic void endDocument() throws SAXException {System.out.println("根结点解析结束");}@Overridepublic void startElement(String uri, String localName, String qName,Attributes attributes) throws SAXException {this.tagName = qName; // 标记元素结点的值if ("teacher".equals(qName)) { // 开始解析第一个teacher结点 准备进行数据封装p = new Person(); // 有几个结点便会产生几个person 对象System.out.println(p);list.add(p);p.setId(Integer.parseInt(attributes.getValue("id")));}System.out.println("元素结点解析开始 " + qName);}@Overridepublic void endElement(String uri, String localName, String qName)throws SAXException {// System.out.println("元素结点解析结束... ");}// 文本结点值public void characters(char[] ch, int start, int length)throws SAXException {String value = new String(ch, start, length);if ("name".equals(tagName)) {p.setName(value);} else if ("age".equals(tagName)) {p.setAge(Integer.parseInt(value));} else if ("gender".equals(tagName)) {p.setGender(value);}	System.out.println("文本元素值 " + value);}
}
  • person实体
package entity;public class Person {// 用于存储xml集合保存的数据private Integer id;private Integer age;private String name;private String gender;public Person() {}public Integer getId() {return id;}public void setId(Integer id) {this.id = id;}public Integer getAge() {return age;}public void setAge(Integer age) {this.age = age;}	public String getName() {return name;}public void setName(String name) {this.name = name;}public String getGender() {return gender;}public void setGender(String gender) {this.gender = gender;}@Override public String toString() {return "Person [id=" + id + ", age=" + age + ", name=" + name+ ", gender=" + gender + "]";}}
  • sax解析
package test;import java.io.IOException;
import java.util.ArrayList;import javax.xml.parsers.ParserConfigurationException;
import javax.xml.parsers.SAXParser;
import javax.xml.parsers.SAXParserFactory;import org.xml.sax.SAXException;import entity.Person;public class SAXParseXML {public static void main(String[] args) {// 使用sax解析xmlSAXParserFactory spf = SAXParserFactory.newInstance();SAXParser sp = null;ArrayList<Person> list = new ArrayList<Person>();try {sp = spf.newSAXParser();sp.parse("person.xml", new MyDefaultHandler(list));} catch (ParserConfigurationException | SAXException e) {e.printStackTrace();} catch (IOException e) {e.printStackTrace();}System.out.println(list);}}/**
*[Person [id=1, age=24, name=cici1, gender=female], 
Person [id=2, age=25, name=cici2, gender=female], 
Person [id=3, age=26, name=cici3, gender=null]]*/

4. 使用DOM4J操作xml文件

4.1 使用DOM4J创建xml文件

  • 创建如图所示的xml

  • 使用dom4j前提

  • coding…
package test;import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStreamWriter;import org.dom4j.Document;
import org.dom4j.DocumentHelper;
import org.dom4j.Element;
import org.dom4j.io.XMLWriter;public class Dom4jCreateXML {public static void main(String[] args) {// xml文档对象Document doc = DocumentHelper.createDocument();// 根节点对象Element root = doc.addElement("Students");// 第一个学生结点Element stu1 = root.addElement("student");stu1.addAttribute("id", "1");// 添加姓名结点stu1.addElement("name").addText("rye");// 添加性别结点stu1.addElement("gender").addText("female");// 可以在创建学生结点的同时添加id属性Element stu2 = root.addElement("student").addAttribute("id", 2 + "");stu2.addElement("name").addText("jack");stu2.addElement("gender").addText("male");Element stu3 = root.addElement("student").addAttribute("id", 3 + "");stu3.addElement("name").addText("rose");stu3.addElement("gender").addText("male");// 利用XMLWriter把内存中的xml 写入文件XMLWriter w = null;try {w = new XMLWriter(new OutputStreamWriter(new FileOutputStream("student.xml"), "utf-8"));w.write(doc);} catch (IOException e) {e.printStackTrace();} finally {try {if (w != null)w.close();} catch (IOException e) {e.printStackTrace();}}}}

4.2 使用DOM4J解析xml文件

package test;import java.util.List;import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.Element;
import org.dom4j.Node;
import org.dom4j.io.SAXReader;public class DOM4jParseXML {@SuppressWarnings("unchecked")public static void main(String[] args) {// SAXReader 读取xml文件SAXReader reader = new SAXReader();Document doc = null;try {doc = reader.read("student.xml");} catch (DocumentException e) {e.printStackTrace();}// 根节点studentsElement root = doc.getRootElement();List<Element> list = root.elements();// 拿到每个学生结点的名字和姓名for (Element stu : list) {// stu.element("name"); 拿到name结点// 获取属性值idSystem.out.println(stu.attributeValue("id"));System.out.println(stu.elementText("name") + "\t" + stu.elementText("gender"));}// 记住! 语法有 有斜杠 必须导入jaxen-1.1.6.jar List<Element> nameNodes = root.selectNodes("//name");nameNodes = doc.selectNodes("//student/name");nameNodes = doc.selectNodes("//student/gender");for (Element name : nameNodes) {System.out.println(name.getName() + "\t" + name.getText());}// 拿到单个结点Node stuNode1 = doc.selectSingleNode("//Students/student[@id='1']/name");System.out.println(stuNode1.getName() + "\t " + stuNode1.getText());}}/**
1
rye	female
2
jack	male
3
rose	male
gender	female
gender	male
gender	male
name	 rye
*/

最后使用dom4j工具类虽然能给我们简化大量解析xml的代码,但是还是得了解jdk提供的api解析原理。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/420886.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

(二)ElasticSearch6.1.1 Python API

0、准备开启数据库 ① 关闭Linux防火墙&#xff0c;这个很重要&#xff0c;否则API总是报错连不上。 # 查看防火墙状态 firewall-cmd --state# 关闭防护墙 systemctl stop firewalld.service# 开启防火墙 systemctl start firewalld.service# 重启防火墙 systemctl restart f…

sqlite3数据库使用

SQLite简介 SQLite是一个软件库&#xff0c;实现了自给自足的、无服务器的、零配置的、事务性的 SQL 数据库引擎。SQLite是一个增长最快的数据库引擎&#xff0c;这是在普及方面的增长&#xff0c;与它的尺寸大小无关。SQLite 源代码不受版权限制。 什么是sqlite SQLite是一…

(三)ElasticSearch的基本概念

0、面向文档 应用中的对象很少只是简单的键值列表&#xff0c;更多时候它拥有复杂的数据结构&#xff0c;比如包含日期、地理位置、另一个对象或者数组。 总有一天你会想到把这些对象存储到数据库中。将这些数据保存到由行和列组成的关系数据库中&#xff0c;就好像是把一个丰…

ajax下拉框省市级联动

目录效果sql数据前后台代码实现效果 初始访问页面 选中省会&#xff0c;自动刷新页面 sql数据 -- 省市联动数据CREATE TABLE PROVINCE (PID NUMBER PRIMARY KEY,PNAME VARCHAR(20) NOT NULL )SELECT * FROM PROVINCEINSERT INTO province VALUES (1, 北京市); INSERT I…

python的with关键字

with语句适用于对资源进行访问的场合&#xff0c;确保不管使用过程中是否发生异常都会执行必要的“清理”操作&#xff0c;释放资源&#xff0c;比如文件使用后自动关闭、线程中锁的自动获取和释放等。with表达式其实是try-finally的简写形式。但是又不是全相同。 ""…

pgm2

MRF 笔记 我们先讨论引入 MRF 的必要性。经典的例子就是四个 r.v.s 连成一个正方形的结构的时候&#xff0c;我们没法通过 BN 获得给定对角线两个 r.v.s 而剩下的条件独立&#xff08;不都是 d-sep&#xff09;&#xff0c;反过来如果希望通过 MRF 刻画某些 BN 也是不可行的&am…

(六)ElasticSearch 6.1.1聚合查询

1 普通类型 1.1 基本操作 1.1.1 导入实战数据 数据字段如下&#xff1a; 字段类型作用pricelong汽车售价colortext汽车颜色maketext汽车品牌solddate销售日期 # 创建索引 PUT /cars {"mappings" : {"transactions" : {"properties" : {"…

12 Essential Bootstrap Tools for Web Designers

12 Essential Bootstrap Tools for Web Designers Posted by vikas on June 6, 2014, filed in: Tools, Web Design 原文地址&#xff1a;http://designzum.com/2014/06/06/12-best-bootstrap-tools-for-web-designers/Bootstrap is a great front end website development pla…

Sublime Text3自定义快捷键

转载于:https://www.cnblogs.com/shimily/articles/3783711.html

打jar包和执行jar包

使用eclipse打jar包 默认生成的目录在/Work/Projects/eclipse-workspace 执行 java -cp hellotest.jar com.feiyangedu.sample.Main java -cp testtesttest.jar com.feiyangedu.sample.Person out&#xff1a;print person java -cp testtesttest.jar com.feiyangedu.sample.…

受限波尔兹曼机

1. 概述 前面描述的神经网络模型是一种确定的结构。而波尔兹曼网络是一种随机网络。如何来描述一个随机网络呢&#xff1f;很多书上有大量的篇幅介绍其原理。这里把它总结为以下两点。 第一&#xff0c;概率分布函数。由于网络节点的取值状态是随机的&#xff0c;从贝叶斯网的…

推荐20款基于 jQuery CSS 的文本效果插件

jQuery 和 CSS 可以说是设计和开发行业的一次革命。这一切如此简单&#xff0c;快捷的一站式服务。jQuery 允许你在你的网页中添加一些真正令人惊叹的东西而不用付出很大的努力&#xff0c;要感谢那些优秀的 jQuery 插件。 所以今天我们将展示一些很酷的文本效果插件&#xff0…

王灏:光音网络致力打造Wi-Fi大生态圈

光音网络&#xff0c;做的是本地网络综合服务。在中国&#xff0c;想把互联网做到覆盖延伸范围之外的最后100米&#xff0c;光音网络是当中一家&#xff0c;也是最坚持的一家。为千万家本地生活商户提供帮助&#xff0c;为数亿本地用户提供最佳的本地网络体验&#xff0c;这是光…