1.XML介绍
xml是可扩展的标记性语言
2.作用:
1.用来保存数据,且这些数据具有自我描述性
2.作为项目或者模块的配置文件
3.可以作为网络传输数据的格式(如json)
3、xml 语法
1. 文档声明。
2. 元素(标签)
3. xml 属性
4. xml 注释
5. 文本区域(CDATA 区)
3.1、文档声明
1.创建一个xml文件
<?xml version="1.0" encoding="utf-8" ?>
<books>
<!-- id:图书的编号 -->
<book id="234325">
<name>西游记</name>
<author>吴承恩</author>
<price>55</price>
</book>
<book id="234325">
<name>三国演义</name>
<author>罗贯中</author>
<price>60</price>
</book>
</books>
3.2、xml的注释
<!-- -->
3.3、元素(标签)
格式:<标签名>封装的数据</标签名>
单标签: <标签名 /> <br /> 换行 <hr />水平线
双标签 <标签名>封装的数据</标签名>
标签名大小写不敏感
标签有属性,有基本属性和事件属性
标签要闭合(不闭合 ,html 中不报错。但我们要养成良好的书写习惯。闭合)
1)什么是 xml
XML元素指的是从(包括)开始标签直到(包括)结束标签的部分
元素可以包含其他元素、文本或者两者都有。元素也可以拥有属性
<books>
<book id="234325">
<name>西游记</name>
<author>吴承恩</author>
<price>55</price>
</book>
<book id="234325">
<name>三国演义</name>
<author>罗贯中</author>
<price>60</price>
</book>
</books>
在以上例子中,<books>和<book>都拥有元素内容,因为他们包含了其他元素,<name><author><price>只有文本内容,因为他们仅包含文本。
元素是指从开始标签到结束标签的内容。
例如:<title>java 编程思想</title>
元素 我们可以简单的理解为是 标签。
Element 翻译 元素
2)xml命名规则
①名称可以含字母、数字以及其他的字符
②名称不能以数字或者标点符号开始
③名称不能包含空格
3)xml 中的元素(标签)也 分成 单标签和双标签
单标签
格式: <标签名 属性=”值” 属性=”值” ...... />
双标签
格式:< 标签名 属性=”值” 属性=”值” ......>文本数据或子标签</标签名>
3.4、xml 属性
xml 的标签属性和 html 的标签属性是非常类似的,属性可以提供元素的额外信息
在标签上可以书写属性:
一个标签上可以书写多个属性。每个属性的值必须使用 引号 引起来。
属性的规则和标签的书写规则一致
3.5、语法规则:
3.5.1)所有 XML 元素都须有关闭标签(也就是闭合)
3.5.2)XML 标签对大小写敏感
3.5.3)XML 必须正确地嵌套
3.5.4)XML 文档必须有根元素
根元素就是顶级元素,没有父标签的元素,叫顶级元素。根元素是没有父标签的顶级元素,而且是唯一一个才行。
3.5.5)XML 的属性值须加引号
3.5.6)XML 中的特殊字符
3.5.7)文本区域(CDATA 区)
CDATA 语法可以告诉 xml 解析器,我 CDATA 里的文本内容,只是纯文本,不需要 xml语法解析
CDATA 格式:
<![CDATA[ 这里可以把你输入的字符原样显示,不会解析 xml ]]>
<?xml version="1.0" encoding="utf-8" ?>
<books>
<book id="234325">
<name>
<![CDATA[<<<三国演义>>>]]>
</name>
<author>罗贯中</author>
<price>60</price>
</book>
</books>
二、xml 解析技术介绍
xml 可扩展的标记语言。
不管是 html 文件还是 xml 文件它们都是标记型文档,都可以使用 w3c 组织制定的 dom 技术来解析
document 对象表示的是整个文档(可以是 html 文档,也可以是 xml
早期 JDK 为我们提供了两种 xml 解析技术 DOM 和 Sax 简介(已经过时,但我们需要知道这两种技术)
dom 解析技术是 W3C 组织制定的,而所有的编程语言都对这个解析技术使用了自己语言的特点进行实现。
Java 对 dom 技术解析标记也做了实现。
sun 公司在 JDK5 版本对 dom 解析技术进行升级:SAX( Simple API for XML )
SAX 解析,它跟 W3C 制定的解析不太一样。它是以类似事件机制通过回调告诉用户当前正在解析的内容。
它是一行一行的读取 xml 文件进行解析的。不会创建大量的 dom 对象。
所以它在解析 xml 的时候,在内存的使用上。和性能上。都优于 Dom 解析
第三方的解析:
jdom 在 dom 基础上进行了封装 、
dom4j 又对 jdom 进行了封装。
pull 主要用在 Android 手机开发,是在跟 sax 非常类似都是事件机制解析 xml 文件。
这个 Dom4j 它是第三方的解析技术。我们需要使用第三方给我们提供好的类库才可以解析 xml 文件。
三、dom4j 解析技术
dom4j 它不是 sun 公司的技术,而属于第三方公司的技术,我们需要使用 dom4j 就需要到 dom4j 官网下载 dom4j 的 jar 包
https://dom4j.github.io/ 点击这个链接下载
3.1、dom4j 编程步骤:
第一步: 先加载 xml 文件创建 Document 对象
第二步:通过 Document 对象拿到根元素对象
第三步:通过根元素.elelemts(标签名); 可以返回一个集合,这个集合里放着。所有你指定的标签名的元素对象
第四步:找到你想要修改、删除的子元素,进行相应在的操作
第五步,保存到硬盘上
需要解析的 books.xml 文件内容
<?xml version="1.0" encoding="UTF-8"?>
<books>
<book sn="SN12341232">
<name>辟邪剑谱</name>
<price>9.9</price>
<author>班主任</author>
</book>
<book sn="SN12341231">
<name>葵花宝典</name>
<price>99.99</price>
<author>班长</author>
</book>
</books>
解析获取 Document 对象的代码
第一步,先创建 SaxReader 对象。这个对象,用于读取 xml 文件,并创建 Documen
import org.dom4j.Document;
import org.dom4j.io.SAXReader;
import org.junit.Test;
public class Dom4jTest {
/**
* dom4j 获取Document对象
* @throws Exception
*/
@Test
public void test1() throws Exception {
// 要获取一个 Document 对象,需要我们先创建一个 SAXReader 对
SAXReader reader = new SAXReader();
// 这个对象用于读取 xml 文件,然后返回一个 Document
Document document = reader.read("xml/books.xml");
// 打印到控制台,看看是否创建成功
System.out.println(document);
}
}
3.2、遍历 标签 获取所有标签中的内容
需要分四步操作:
第一步,通过创建 SAXReader 对象。来读取 xml 文件,获取 Document 对象
第二步,通过 Document 对象。拿到 XML 的根元素对象
第三步,通过根元素对象。获取所有的 book 标签对象
第四步,遍历每个 book 标签对象。然后获取到 book 标签对象内的每一个元素,再通过 getText() 方法拿到起始标签和结 束标签之间的文本内容
package com.wqh.bean;
import org.dom4j.Document;
import org.dom4j.Element;
import org.dom4j.io.SAXReader;
import org.junit.Test;
import java.util.List;
public class Dom4jTest {
/**
* dom4j 获取Document对象
* @throws Exception
*/
@Test
public void test1() throws Exception {
// 要获取一个 Document 对象,需要我们先创建一个 SAXReader 对
SAXReader reader = new SAXReader();
// 这个对象用于读取 xml 文件,然后返回一个 Document
Document document = reader.read("xml/books.xml");
//通过 Document 对象。拿到 XML 的根元素对象
Element rootElement = document.getRootElement();
// 打印测试
// Element.asXML() 它将当前元素转换成为 String 对象
// System.out.println( root.asXML() );
//通过根元素对象中的elements(标签名) 获取指定标签名根元素下的所有的子元素
List<Element> books = rootElement.elements("book");
//遍历每个 book 标签对象。然后获取到 book 标签对象内的每一个元素,
for (Element book : books){
//获取book下面的name元素对象
Element name = book.element("name");
//获取price下面的name元素对象
Element price = book.element("price");
//获取author下面的name元素对象
Element author = book.element("author");
//再通过 getText() 方法拿到起始标签和结束标签之间的文本内容
System.out.println("书名" + name.getText() + " , 价格:"
+ price.getText() + ", 作者:" + author.getText());
}
}
}
elementText(标签名):可以直接获取指定标签名的文本内容
@Test
public void test1() throws Exception {
// 要获取一个 Document 对象,需要我们先创建一个 SAXReader 对
SAXReader reader = new SAXReader();
// 这个对象用于读取 xml 文件,然后返回一个 Document
Document document = reader.read("xml/books.xml");
//通过 Document 对象。拿到 XML 的根元素对象
Element rootElement = document.getRootElement();
// 打印测试
// Element.asXML() 它将当前元素转换成为 String 对象
// System.out.println( root.asXML() );
//通过根元素对象中的elements(标签名) 获取指定标签名根元素下的所有的子元素
List<Element> books = rootElement.elements("book");
//遍历每个 book 标签对象。然后获取到 book 标签对象内的每一个元素,
for (Element book : books){
//获取book下面的name元素对象
String name = book.elementText("name");
//获取price下面的name元素对象
String price = book.elementText("price");
//获取author下面的name元素对象
String author = book.elementText("author");
//再通过 getText() 方法拿到起始标签和结束标签之间的文本内容
System.out.println("书名" + name + " , 价格:"
+ price + ", 作者:" + author);
}
}
attributeValue(属性名):通过属性名获取属性值
package com.wqh.bean;
import org.dom4j.Document;
import org.dom4j.Element;
import org.dom4j.io.SAXReader;
import org.junit.Test;
import java.util.List;
public class Dom4jTest {
/**
* dom4j 获取Document对象
* @throws Exception
*/
@Test
public void test1() throws Exception {
// 要获取一个 Document 对象,需要我们先创建一个 SAXReader 对
SAXReader reader = new SAXReader();
// 这个对象用于读取 xml 文件,然后返回一个 Document
Document document = reader.read("xml/books.xml");
//通过 Document 对象。拿到 XML 的根元素对象
Element rootElement = document.getRootElement();
// 打印测试
// Element.asXML() 它将当前元素转换成为 String 对象
// System.out.println( root.asXML() );
//通过根元素对象中的elements(标签名) 获取指定标签名根元素下的所有的子元素
List<Element> books = rootElement.elements("book");
//遍历每个 book 标签对象。然后获取到 book 标签对象内的每一个元素,
for (Element book : books){
//获取book下面的name元素对象
String name = book.elementText("name");
//获取price下面的name元素对象
String price = book.elementText("price");
//获取author下面的name元素对象
String author = book.elementText("author");
//获取book标签属性名sn 的值
String sn = book.attributeValue("sn");
//再通过 getText() 方法拿到起始标签和结束标签之间的文本内容
System.out.println("书名" + name + " , 价格:"
+ price + ", 作者:" + author +",sn:" + sn);
}
}
}