XML
-
定义:可扩展的标记性语言
-
可扩展是因为xml中的标签都不是xml本身的,都是可以自定义的
-
students.xml <students> <student> <id>1</id> <name>yf</name> </student> <student> <id>2</id> <name>zz</name> </student> </students>
-
-
作用:
- 用来保存数据,并且数据具有自我描述性
- 可以作为项目或者模块的配置文件
- 还可以作为网络传输数据的格式(现在则以JSON为主)
示例
-
创建xml文件
- idea中没有新建xml文件的选项,选择file,然后自己写xxxx.xml
-
第一个程序
<?xml version="1.0" encoding="utf-8" ?> <!-- <?xml version="1.0" encoding="utf-8" ?> 这部分内容表示xml文件的声明 version表示xml的版本 encoding表示xml的本身的编码 --> <books> <!--books表示多个图书信息--> <book sn="SN0000001"> <!--book表示一个图书信息 sn属性表示图书序列号--> <name>时间简史</name> <!--name标签表示书名--> <author>霍金</author> <!--author标签表示作者--> <price>75</price> <!--price标签表示价格--> </book> <book sn="SN0000002"> <!--book表示一个图书信息 sn属性表示图书序列号--> <name>基因的奥德赛之旅</name> <!--name标签表示书名--> <author>斯宾塞·韦尔斯</author> <!--author标签表示作者--> <price>58</price> <!--price标签表示价格--> </book> </books>
-
若你的编辑器没有校验功能,可以使用浏览器进行校验
语法介绍
-
注释:html和xml注释相同
<!--注释信息-->
-
元素(标签)
-
html中
-
格式:<标签名>封装的数据</标签名>
-
单标签:<标签名 />
<br> 换行 <hr> 水平线
-
双标签:<标签名>封装的数据</标签名>
-
标签名大小写不敏感
-
标签有属性,有基本属性和事件属性
-
标签要闭合(不闭合html中也不会报错,但是我们要有良好的书写习惯)
-
-
xml中
-
定义:元素指的是从(且包括)开始标签直到(且包括)结束标签的部分
-
元素可包含其他元素、文本或者两者的混合物。元素也可以拥有属性
-
命名规则:
- 名称可以包含字母、数字和其他的字符
- 名称不能以字符"xml"或者"XML"、"Xml"开始
- 名称不能包含空格(和属性没法区别)
-
也分为单标签和双标签
-
<books> <!--books表示多个图书信息--> <book sn="SN0000001"> <!--book表示一个图书信息 sn属性表示图书序列号--> <name>时间简史</name> <!--name标签表示书名--> <author>霍金</author> <!--author标签表示作者--> <price>75</price> <!--price标签表示价格--> </book> <book sn="SN0000002" name="基因的奥德赛之旅" author="斯宾塞·韦尔斯" price="58" /> </books>
-
-
-
-
属性:
- 和html中类似,属性可以提供元素的额外信息
- 在标签上可以书写属性
- 一个标签可以书写多个属性。属性的值必须使用引号括起来
- 规则和标签的书写规则一致
-
语法规则:
-
xml中的元素都必须关闭标签(也就是闭合状态)
-
xml是强语法规则,错了会报错
-
对大小写敏感
-
标签必须正确的嵌套
-
xml文档必须有根元素
- 根元素就是顶级元素
- 没有父标签的元素,叫顶级元素
- 根元素就是没有父标签的顶级元素,而且是唯一一个
-
特殊字符:
-
- 在 XML 中,只有字符 "<" 和 "&" 确实是非法的。大于号是合法的,但是用实体引用来代替它是一个好习惯。
-
文本区域(CDATA区)
-
CDATA语法可以告诉xml解析器,这里的文本内容,只是纯文本,不需要xml语法解析
-
格式:
-
<![CDATA[这里的可以把你输入的字符原样显示,不会解析xml]]>
-
-
XML解析技术介绍
-
xml是可扩展的标记语言
-
不管是html文件还是xml文件,都是标记型文档,都可以使用w3c组织制定的dom技术(标签都会被转化为对象)来解析
-
解析:读取xml中的数据,转化成我们要用的内容
- document对象就表示整个文档(无论是xml还是html)
- dom4j是第三方解析技术。我们需要使用第三方给我们提供的类库才能解析xml文件
dom4j
-
不是sun,也不是甲骨文公司的技术,属于第三方
-
文件夹介绍
- docs文件夹下的index.html是dom4j的使用手册
- lib存放以来的jar包
- src是dom4j的源码
-
使用dom4j解析xml,获取document对象
- 准备好一个xml文件
- 对应的创建一个类文件
- 创建对应的属性
- 方法
- 无参构造
- 有参构造
- getter and setter
- 创建一个lib目录,复制dom4j到目录中,将jar包添加到类路径,选择jar包->右键->add as library
<!--books.xml-->
<?xml version="1.0" encoding="utf-8" ?>
<!--
<?xml version="1.0" encoding="utf-8" ?>
这部分内容表示xml文件的声明
version表示xml的版本
encoding表示xml的本身的编码
-->
<books> <!--books表示多个图书信息-->
<book sn="SN0000001"> <!--book表示一个图书信息 sn属性表示图书序列号-->
<name>时间简史</name> <!--name标签表示书名-->
<author>霍金</author> <!--author标签表示作者-->
<price>75</price> <!--price标签表示价格-->
</book>
<book sn="SN0000002"> <!--book表示一个图书信息 sn属性表示图书序列号-->
<name>基因的奥德赛之旅</name> <!--name标签表示书名-->
<author>斯宾塞·韦尔斯</author> <!--author标签表示作者-->
<price>58</price> <!--price标签表示价格-->
</book>
</books>
// Book.java
package syf;
import java.math.BigDecimal;
public class Book {
private String sn;
private String name;
private BigDecimal price;
private String author;
// 快捷键alt+Insert
// 无参构造
public Book() {
}
// 有参构造
public Book(String sn, String name, BigDecimal price, String author) {
this.sn = sn;
this.name = name;
this.price = price;
this.author = author;
}
// getter setter方法
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 + '\'' +
'}';
}
}
// Dom4jText.java
package syf;
import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.Element;
import org.dom4j.io.SAXReader;
import org.junit.Test;
import java.util.List;
public class Dom4jText {
// 导入Test修饰需要加入两个jar包
// hamcrest-core-1.3.jar和junit-4.12.jar
@Test
public void text1() throws Exception {
// 创建一个SAXReader输入流,去读取xml配置文件,生成Document对象
SAXReader saxReader = new SAXReader();
Document document = saxReader.read( "src/books.xml" );
}
// 读取books.xml文件,生成book类
@Test
public void test2() throws Exception {
// 1.读取book.xml
SAXReader reader = new SAXReader();
// 在Junit测试中,相对路径是从模块名开始算
Document document = reader.read( "src/books.xml" );
// 2.通过Dom对象获取根元素
Element rootElement = document.getRootElement();
// 3.通过根元素获取book标签对象
// element和elements都是通过标签名查找子元素
List<Element> books = rootElement.elements("book");
// 4.遍历,处理每个book标签转换为book类
for (Element book : books){
// asXML()把标签对象转换为标签字符串
Element nameElement = book.element("name");
// getText()可以获取标签中的文本内容
String nameText = nameElement.getText();
// elementText()直接获取指定标签名的文本内容
String priceText = book.elementText("price");
// 获取属性值
String snValue = book.attributeValue("sn");
System.out.println(new Book(snValue,nameText));
}
}
}