XML的简介
- XML 指可扩展标记语言(EXtensible Markup Language)
- XML 是一种标记语言,很类似 HTML
- XML 的设计宗旨是传输数据,而非显示数据
- XML 标签没有被预定义。您需要自行定义标签。
- XML 被设计为具有自我描述性。
- XML 是 W3C 的推荐标准
- XML 允许创作者定义自己的标签和自己的文档结构。
- XML 是各种应用程序之间进行数据传输的最常用的工具,并且在信息存储和描述领域变得越来越流行。
XML文件的创建
1.直接创建file,取名为xxx.xml
2.配置模板,这样以后创建起来就很方便了。
XML语法
1.所有 XML 元素都须有关闭标签。
//错误演示
<p>This is a paragraph
//正确写法
<p>This is another paragraph</p>
2.XML 标签对大小写敏感。
<Message>这是错误的。</message>
<message>这是正确的。</message>
3.XML 必须正确地嵌套。
<b><i>错误嵌套</b></i>
<b><i>正确嵌套</i></b>
4.XML 文档必须有一个根元素。
<root>
<child>
...
</child>
</root>
5.XML 的属性值须加引号。
<student name="zhangsan"></student>
6.在 XML 中,空格会被保留。
<student>a b</student>
//输出:a b
7.XML 中的注释。
<!-- 我是一个注解 -->
8.实体引用(转义字符)。
//解析会出现错误
<student>a>b</student>
//正确写法
<student>a>b</student>
XML元素
XML 元素指的是从(且包括)开始标签直到(且包括)结束标签的部分,元素可包含其他元素、文本或者两者的混合物。元素也可以拥有属性。
XML 元素必须遵循以下命名规则:
- 名称可以含字母、数字以及其他的字符。
- 名称不能以数字或者标点符号开始。
- 名称不能以字符 “xml”(或者 XML、Xml)开始。
- 名称不能包含空格。
属性的定义以及注意事项:
- 属性必须定义在标签体的开始标签体内。
- 以键值对的方式定义,值必须用引号引起来( 属性名=“属性值”)。
- 一个标签中可以有多个属性,但是不能有同名的属性。
- 属性名不能使用空格、冒号等特殊字符,且必须以字母开头。
xml标签的两种写法:
//普通闭合标签 可以有子元素且可以有属性和文本
<birthday></birthday>
//自闭合标签 不能有子元素且只能有属性
<birthday/>
dtd约束
定义dtd约束:
<!-- xml中有一个根标签books
标签books中有两个子标签book
*代表的多个-->
<!ELEMENT books (book*) >
<!-- book中有多个标签 *代表可以写多个 -->
<!ELEMENT book (press*,birthday*,price*)>
<!-- #PCDATA:此标签体中应该是文本-->
<!ELEMENT press (#PCDATA)>
<!ELEMENT birthday (#PCDATA)>
<!ELEMENT price (#PCDATA)>
<!-- book标签中有一个属性:name 必须设置(#REQUIRED)-->
<!ATTLIST book name CDATA #REQUIRED>
XML文件:
<?xml version="1.0" encoding="UTF-8" ?>
<!-- 绑定约束 -->
<!DOCTYPE books SYSTEM "xml-dom4j/src/bookss.dtd">
<books>
<book name = "《武林秘籍》">
<press>王大师</press>
<birthday>2010-6-6</birthday>
<price>125.00</price>
</book>
<book name="《降龙十八掌》">
<press>星爷</press>
<birthday>2005-5-5</birthday>
<price>115.80</price>
</book>
</books>
约束解读:
DOCTYPE:文档类型
books :根标签
SYSTEM:本地系统文件
"bookss.dtd":产生关系的文件名
book*可以写多哥该标签
CDATA:代表的是标签中的属性值为字符型
#REQUIRED:属性值必须设置
Schema约束
关于Schema请参照:
https://blog.csdn.net/jdbdh/article/details/82469404
使用dom4j解析
把整个xml文档加载进内存,保留完整的结构信息,然后进行解析。
使用前:导入相关jar包
用到的API :
-
SAXReader (核心类)
-
Document read(绑定了这个xml文件的输入流); 传入一个输入流,返回一个Document对象
Document对象:
- Element getRootElement(); 获取跟标签
Element标签对象:
- List elements(); 获取当前根标签下所有的标签
- String attributeValue(String name); 获取标签内属性的value
- String elementText(String name); 获取指定标签的文本内容,不能是当前标签
- String getText(); 获取当前标签的文本内容
xml文档
<?xml version="1.0" encoding="UTF-8" ?>
<!-- 绑定约束 -->
<!DOCTYPE books SYSTEM "xml-dom4j/src/bookss.dtd">
<books>
<book name = "《武林秘籍》">
<press>王大师</press>
<birthday>2010-6-6</birthday>
<price>125.00</price>
</book>
<book name="《降龙十八掌》">
<press>星爷</press>
<birthday>2005-5-5</birthday>
<price>115.80</price>
</book>
</books>
dom4j解析
public class BooksTest {
public static void main(String[] args)throws Exception {
InputStream in = BooksTest.class.getClassLoader().getResourceAsStream("books.xml");
//创建SAXRead对象
SAXReader sr = new SAXReader();
Document read = sr.read(in);
//获取根标签books
Element element = read.getRootElement();
//获取books下所有book
List<Element> list = element.elements();
//遍历所有book
for (Element e : list) {
String name = e.attributeValue("name");
String press = e.elementText("press");
String birthday = e.elementText("birthday");
String price = e.elementText("price");
System.out.println("书名:" + name + " 出版设:" + press + " 出版日期:" + birthday + " 价格:" + price);
}
}
}
结果:
书名:《武林秘籍》 出版设:王大师 出版日期:2010-6-6 价格:125.00
书名:《降龙十八掌》 出版设:星爷 出版日期:2005-5-5 价格:115.80
使用xpath解析
使用前:导入相关jar包,并且需要有dom4j的支持。
用到的方法:
- List selectNodes(String name); 获取所有的指定标签的内容。
- Node selectSingleNode(String name); 获取指定标签的第一个内容。
xml文档
<?xml version="1.0" encoding="UTF-8" ?>
<students>
<student number="001">
<name id="it">
<xing>张</xing>
<ming>三</ming>
</name>
<age>18</age>
<sex>nan</sex>
</student>
<student number="002">
<name>jack</name>
<age>18</age>
<sex>nv</sex>
</student>
</students>
xpath解析
public class StudentTest {
public static void main(String[] args)throws Exception {
InputStream in = StudentTest.class.getClassLoader().getResourceAsStream("student.xml");
//获取SAXReader对象
SAXReader sr = new SAXReader();
Document read = sr.read(in);
//获取根标签students
Element element = read.getRootElement();
//获取所有age
List<Node> ages = element.selectNodes("//age");
System.out.println("age们:" + ages);
//获取所有sex
List<Node> sexs = element.selectNodes("/students/student/sex");
System.out.println("sex们:" + sexs);
//获取第一个sex
Node sex = element.selectSingleNode("//sex");
System.out.println("第一个sex:" + sex);
//获取标签是name,属性是id的标签
Node name = element.selectSingleNode("//name[@id]");
System.out.println("获取的name:" + name);
}
}
结果:
age们:[org.dom4j.tree.DefaultElement@1c655221 [Element: <age attributes: []/>], org.dom4j.tree.DefaultElement@41975e01 [Element: <age attributes: []/>]]
sex们:[org.dom4j.tree.DefaultElement@726f3b58 [Element: <sex attributes: []/>], org.dom4j.tree.DefaultElement@6d9c638 [Element: <sex attributes: []/>]]
第一个sex:org.dom4j.tree.DefaultElement@726f3b58 [Element: <sex attributes: []/>]
第一个name:org.dom4j.tree.DefaultElement@4cdf35a9 [Element: <name attributes: [org.dom4j.tree.DefaultAttribute@5e265ba4 [Attribute: name id value "it"]]/>]
大家还可以参照官方文档学习:https://www.w3school.com.cn/xml/index.asp
不好的地方还请大家指点,我给予改正。(抱拳)