初识XML

XML简介

定义:是一门可拓展的标记性语言

作用:

  • 用来保存数据,而且这些数据具有自我描述性
  • 可以作为项目或者模块的配置文件
  • 作为网络传输数据的格式(现在以JSON为主)

XML解析技术

xml是可扩展的标记语言。不管是html文件还是xml文件它们都是标记型文档,都可以使用w3c组织制定的dom技术来解析。

XML文档对象模型定义访问和操作XML文档的标准方法。DOM将XML文档作为一个树形结构,而其树叶被定义为结点
在这里插入图片描述

document对象表示的是整个文档(可以是html文档,也可以是xml文档)

早期JDK为我们提供了两种xml解析技术Dom和Sax(已过时)

dom解析技术是w3c组织制定的。而所有编程语言都对这个解析技术使用了自己语言的特点进行实现。Java对dom技术解析标记也做了实现。sun公司在JDK5版本对dom解析技术进行升级:SAX(Simple API for XML)qi跟W3C制定的解析不太一样。它是以类似世家机制通过回调告诉用户当前正在解析的内容。它是一行一行的读取xml文件进行解析的。不会创建大量的dom对象。所以其在解析xml的时候,在内存使用和性能上都优于DOM解析

此外,还有一些第三方解析:

  • jdom在dom基础上进行了封装
  • dom4j又对jdom进行了封装
  • pull主要用在Android手机开发,跟sax非常类似,都是事件机制解析xml文件

这个Dom4j是第三方解析技术,我们需要使用第三方给我们提供更好的类库才可以解析xml文件

XML语法

XML元素(标签)必须遵循以下命名规则:

  • 名称可以含字母、数字以及其他的字符
  • 名称不能以数字或者标点符号开始
  • 名称不能以字符"xml"(或XML、Xml等)开始(xml的大小写敏感)
  • 名称不能包含空格
  • 所有xml属性都必须有关闭标签(闭合)
  • xml文档必须有根元素(顶级元素,没有父标签且只有一个的元素)
  • 标签可以为双标签,也可以是单标签
  • 文本区域(CDATA区):告诉xml解析器,该区域内部的的文本内容只是纯文本,不需要xml语法解析
<!--CDATA格式-->
<![CDATA[此处为纯文本内容,不需要解析]]>

XML属性

xml的标签属性和html的标签属性非常类似,属性可以提供元素的额外信息。在标签上可以书写属性:一个标签可以书写多个属性,每个属性的值必须使用引号引起来,其规则和标签的书写规则一致。

dom4j解析技术(重点)

Dom4j类库的使用

官方下载链接:https://dom4j.github.io/(初学建议下载1.6的zip文件,防止不兼容问题发生,方便后续操作)

docs是文档目录
在这里插入图片描述
在这里插入图片描述
查找dom4j文档
在这里插入图片描述

Dom4j快速入门
在这里插入图片描述
lib目录
在这里插入图片描述

src目录是第三方类库的源码目录
在这里插入图片描述

dom4j编程步骤

第一步: 先加载 xml 文件创建 Document 对象

第二步:通过 Document 对象拿到根元素对象

第三步:通过根元素.elelemts(标签名); 可以返回一个集合,这个集合里放着。所有你指定的标签名的元素对象

第四步:找到你想要修改、删除的子元素,进行相应在的操作

第五步,保存到硬盘上

获取document对象

创建一个 lib 目录,并添加 dom4j 的 jar 包。并添加到类路径。
在这里插入图片描述

<?xml version="1.0" encoding="UTF-8" ?>
<books>
    <book sn="SN123214212">
        <name>西游记</name>
        <price>49.9</price>
        <author>吴承恩</author>
    </book>
    <book sn="SN52661728">
        <name>红楼梦</name>
        <price>53.8</price>
        <author>曹雪芹</author>
    </book>
</books>

此外,还需要两个jar包:

创建一个book类

import java.math.BigDecimal;
/**
 * @BelongsProject: JavaWeb
 * @BelongsPackage: Book
 * @Author: HeXin
 * @CreateTime: 2023/1/27  10:01
 * @Description:
 * @Version: 1.0
 */
public class Book {
	private String sn;
	private String name;
	private BigDecimal price;
	private String author;
	
	public String getSn () {
		return sn;
	}
	
	public void setSn (String sn) {
		this.sn = sn;
	}
	
	public String getName () {
		return name;
	}
	
	public void setName (String name) {
		this.name = name;
	}
	
	public BigDecimal getPrice () {
		return price;
	}
	
	public void setPrice (BigDecimal price) {
		this.price = price;
	}
	
	public String getAuthor () {
		return author;
	}
	
	public void setAuthor (String author) {
		this.author = author;
	}
	
	@Override
	public String toString () {
		return "Book{" +
				"sn='" + sn + '\'' +
				", name='" + name + '\'' +
				", price=" + price +
				", author='" + author + '\'' +
				'}';
	}
	
	public Book (String sn, String name, BigDecimal price, String author) {
		this.sn = sn;
		this.name = name;
		this.price = price;
		this.author = author;
	}
	
	public Book () {
	}
}

创建DOM4jTest测试类

import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.Element;
import org.dom4j.io.SAXReader;
import org.junit.Test;

import java.math.BigDecimal;
import java.util.List;

/**
 * @BelongsProject: JavaWeb
 * @BelongsPackage: DOM4jTest
 * @Author: HeXin
 * @CreateTime: 2023/1/27  23:13
 * @Description:
 * @Version: 1.0
 */
public class DOM4jTest {
	@Test
	public void test1(){
		//创建一个SAXReader输入流,读取xml配置文件,生成document对象
		SAXReader saxReader = new SAXReader();
		Document read = null;
		try {
			 read = saxReader.read("src/books.xml");
		} catch (DocumentException e) {
			e.printStackTrace();
		}
		System.out.println(read);
	}
	
	
	@Test
	/**
	 * @Description:读取books.xml文件生成Book类
	 * @CreateTime:2023/1/28 8:39
	 * @Author:HeXin
	 *
	 */
	public void test2(){
		//1.读取books.xml文件
		SAXReader reader = new SAXReader();
		//在Junit测试中,相对路径是从模块名开始
		Document document = null;
		try {
			document = reader.read("src/books.xml");
		} catch (DocumentException e) {
			e.printStackTrace();
		}
		//2.通过Document对象获取根元素
		Element root = document.getRootElement();
		//3.通过根元素获取book标签对象
		List<Element> books = root.elements("book");
		//4.遍历,处理每个book标签转换为Book类
		for(Element book : books){
			//asXML()把标签对象转换为标签字符串
			Element nameElement = book.element("name");
			//getText():可以获取标签中的文本内容
			String name = nameElement.getText();
			//直接获取指定标签名的文本内容
			String price = book.elementText("price");
			String author = book.elementText("author");
			String sn = book.attributeValue("sn");//获取属性值
			System.out.println(new Book(sn,name, BigDecimal.valueOf(Double.parseDouble(price)),author));
		}
	}
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值