整理自尚硅谷Javaweb课程(后端)及其笔记js仅用作个人笔记留存
文章目录
XML简介
xml是可扩展(即可以自定义)的标记性语言
- 作用
- 用来保存数据,而这些数据具有自我描述性
- 可以作为项目或者模块的配置文件
- 可以作为网络传输数据的格式(现在JSON为主)
XML语法
文档声明
<?xml version="1.0" encoding="utf-8" ?>
<!--
上面是xml文件的声明
version="1.0" 表示版本为1.0
encoding="utf-8" 表示当前xml文件的编码格式
-->
<books> <!--此处books表示多个图书信息-->
<book sn="SN123456789"> <!--book表示一个图书的信息,sn表示图书序列号-->
<name>时间简史</name> <!--name标签表示书名-->
<author>霍金</author> <!--author表示作者-->
<price>75</price> <!--price表示图书价格-->
</book>
<book sn="SN123456789"> <!--book表示一个图书的信息,sn表示图书序列号-->
<name>java从入门到入土</name> <!--name标签表示书名-->
<author>学习</author> <!--author表示作者-->
<price>3125</price> <!--price表示图书价格-->
</book>
</books>
注释
与html一样:
元素(标签)
xml元素
-
xml元素是指从开始标签到结束标签的部分
-
元素可以包含其他元素、文本或者两者的混合物
-
元素可以拥有属性
xml命名规则
- 名称可以含有字母数字和其他的字符
- 不能以数字或者标点符号开始
- 不能以"xml"开头,其任意大小写也是
- 名称不能 包含空格
xml分为单标签和双标签
-
单标签和双标签效力相等
-
单标签的属性等价于双标签的属性加上内部的子标签所包含的内容
xml属性
- xml属性可以提供元素的额外信息
- 标签的属性必须用引号引起来
语法规则
-
所有xml元素都必须关闭标签
-
xml标签对大小写敏感
-
xml必须正确的嵌套
-
xml必须有根元素
- 根元素是没有父标签的顶级元素,而且是唯一一个
-
xml的属性值必须加上引号
-
xml特殊字符
- <
- >
-
文本区域(CDATA区)
- 该区域内只是纯文本,不需要xml语法解析
- 格式:
- <![CDATA[**这里可以吧输出的字符原样输出,不会解析**]]
xml解析技术
略,暂时没必要,自己查资料看看即可
Dom4j解析技术
Dom4j类库
GitHub地址:Dom4j
Dom4j文档目录介绍
-
docs
- 参考文档目录,一般从index界面进入。英文界面
-
lib
- 其依赖的第三方jar包
-
src
- 第三方类库的源码和测试代码
获取document对象
准备工作
需要解析的xml文件
<?xml version="1.0" encoding="utf-8" ?>
<!--
上面是xml文件的声明
version="1.0" 表示版本为1.0
encoding="utf-8" 表示当前xml文件的编码格式
-->
<books> <!--此处books表示多个图书信息-->
<book sn="SN123456789"> <!--book表示一个图书的信息,sn表示图书序列号-->
<name>时间简史</name> <!--name标签表示书名-->
<author>霍金</author> <!--author表示作者-->
<price>75</price> <!--price表示图书价格-->
</book>
<book sn="SN123456789"> <!--book表示一个图书的信息,sn表示图书序列号-->
<name>java从入门到入土</name> <!--name标签表示书名-->
<author>学习</author> <!--author表示作者-->
<price>3125</price> <!--price表示图书价格-->
</book>
</books>
根据要解析的内容创建的对应对象类
-
有无参、全部构造器
-
get、set方法
-
toString 方法
package pojo; import java.math.BigDecimal; public class Book { private String sn; private String name; private String author; private BigDecimal price; public Book() { } public Book(String sn, String name, String author, BigDecimal price) { this.sn = sn; this.name = name; this.author = author; this.price = price; } 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 String getAuthor() { return author; } public void setAuthor(String author) { this.author = author; } public BigDecimal getPrice() { return price; } public void setPrice(BigDecimal price) { this.price = price; } @Override public String toString() { return "Book{" + "sn='" + sn + '\'' + ", name='" + name + '\'' + ", author='" + author + '\'' + ", price=" + price + '}'; } }
获取对象
-
创建一个lib目录,并添加dom4j的jar包(以本人使用为例)
- 添加到类路径: 右键 最下方Add as Library…
- 设置model权限即可(global全部、Project项目、model模型)
-
创建测试类
- 将测试需要的两个junit的jar包添加到lib
- junit-4.12
- hamcrest-core-1.3
- 将测试需要的两个junit的jar包添加到lib
-
按照dom4j的文档说明获取对象
package pojo;
import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.io.SAXReader;
import org.junit.Test;
public class Dom4jTest {
@Test
public void test01() throws DocumentException {
//创建一个SAXReaders输入流,去读取xml配置文件,生成Document对象
SAXReader saxReader = new SAXReader();
Document document = saxReader.read("src/01_books.xml");
System.out.println(document);
}
}
读取xml文件生成java类
package pojo;
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;
public class Dom4jTest {
@Test
public void test01() throws DocumentException {
//创建一个SAXReaders输入流,去读取xml配置文件,生成Document对象
SAXReader saxReader = new SAXReader();
//在Junit测试中,相对路径是从模块名开始的
Document document = saxReader.read("src/01_books.xml");
System.out.println(document);
}
@Test
public void test02() throws DocumentException {
//读取book.xml文件
SAXReader saxReader = new SAXReader();
//在Junit测试中,相对路径是从模块名开始的
Document document = saxReader.read("src/01_books.xml");
//通过document对象获取根元素
Element rootElement = document.getRootElement();
//System.out.println(rootElement);
//通过根元素获取book标签对象
//element和elements都是通过标签名查找子元素,但是一个是一个,一个是多个
List<Element> books = rootElement.elements("book");
//遍历,处理每个book标签对象转化为Book类
for (Element book : books) {
//asXML()把标签对象转化为标签字符串
//System.out.println(book.asXML());
Element nameElement = book.element("name");
//getTest()获取标签的文本内容
String nameText = nameElement.getText();
//直接获取指定标签的文本内容
//上述也可直接使用String nameTest = .elementTest("name");
String priceTest = book.elementText("price");
String authorTest = book.elementText("author");
//获取标签属性的文本内容
String snValue = book.attributeValue("sn");
System.out.println(new Book(snValue, nameText, authorTest, Double.parseDouble(priceTest)));
}
}
}