1、XML概述
- XML是可扩展标记语言(eXtensible Markup Language)的缩写,是一种数据表示格式,可以描述非常复杂的数据结果,如果XML内容存为文件,那么它就是一个XML文件
- XML的内容经常被当成消息进行网络传输,或者作为配置文件用于存储系统信息
2、XML的创建
- 创建一个XML类型的文件,要求文件的后缀必须使用xml,如hello_world.xml
IDEA创建XML文件
3、XML语法规则
XML文件的后缀名为:xml
文档声明必须是第一行
<?xml version="1.0" encoding="utf-8" ?>
version:xml默认的版本号码,该属性是必须存在的
encoding:本xml文件的编码
XML的标签(元素)规则
标签由一对尖括号和合法标识符组成,必须有且只有一个根标签
<name></name>
标签必须有开始就有结束
特殊标签可以不成对,但必须有结束标识
<br/>
标签中可以定义属性,属性和标签名空格隔开,属性值必须用引号引起来
<student id = "1"></name>
标签需要正确的嵌套
<student id = "1"> <name>张三</name> </student>
4、XML的其他组成
XML文件中可以定义注释信息
<!--这是注释 -->
XML文件中可以存在以下特殊字符
< < 小于 > > 大于 & & 和号 ' ' 单引号 " " 双引号
5、XML文档约束方式
什么是文档约束?
文档约束就是用来限定xml文件中的标签及其属性该怎么写,以此强制约束程序员必须按照文档约束的规定来编写xml文件
文档约束的分类
- DTD
- schema
5.1、XML文档约束-DTD的使用
利用DTD文档约束,约束一个xml文件的编写
编写DTD约束文档,后缀必须是.dtd
这里可以用英文哦,演示用中文
<!ELEMENT 书架 (书+)> <!ELEMENT 书 (书名,作者,售价)> <!ELEMENT 书名 (#PCDATA)> <!ELEMENT 作者 (#PCDATA)> <!ELEMENT 售价 (#PCDATA)>
在需要编写的XML文件中导入该DTD约束文件
<!DOCTYPE 书架 SYSTEM "data.dtd">
按照约束的规则编写XML文件内容
<?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE 书架 SYSTEM "data.dtd"> <书架> <书> <书名>web从入门到精通</书名> <作者>小林</作者> <售价>9.9</售价> </书> </书架>
这里大家应该有意识到,dtd并不能约束数据的类型,所以还有第二种约束方式
5.2、XML文档约束-schema的使用
文档约束-schema
- schema可以约束具体的数据类型,约束能力更强大
- schema本身也是一个xml文件,本身也受到其他约束文件的要求,所以编写的更加严谨
利用schema文档约束,约束一个xml文件的编写
编写schema约束文档,后缀必须是.xsd
<?xml version="1.0" encoding="UTF-8" ?> <schema xmlns="http://www.w3.org/2001/XMLSchema" targetNamespace="http://www.itcast.cn" elementFormDefault="qualified"> <element name="书架"> <complexType> <sequence maxOccurs="unbounded"> <element name='书'> <complexType> <sequence> <element name='书名' type="string"></element> <element name='作者' type="string"></element> <element name='售价' type="double"></element> </sequence> </complexType> </element> </sequence> </complexType> </element> </schema>
在编写的xml文件中导入schema约束文档
<?xml version="1.0" encoding="utf-8" ?> <书架 xmlns="http://www.itcast.cn"> </书架>
按照约束内容编写xml文件的标签
<书> <书名>web</书名> <作者>小林</作者> <售价>1.0</售价> </书>
6、XML解析
什么是XML解析
- 使用程序读取XML中的数据
两种解析方式
- SAX解析
- DOM解析(常用)
7、Dom解析
Dom常见的解析工具
名称 | 说明 |
---|---|
JAXP | SUN公司提供的一套XML的解析API |
JDOM | JDOM是一个开源项目,它基于树型结构,利用纯JAVA的技术对XML文档实现解析、生产、序列化及多种操作 |
dom4j | 是JDOM的升级品,用来读取XML文件的,具有性能优异,功能强大和极其容易使用的特点,它的性能超过sun公司官方的dom技术,同时它是一个开放源代码的软件,HIbernate也是用它来读写配置文件 |
jsoup | 功能强大DOM方式的XML解析开发包,尤其对HTML解析更加方便 |
7.1、使用Dom4j解析出XML文件
使用Dom4j解析出XML文件的数据进行解析
- 下载Dom4j框架,官网下载:dom4j
- 在项目中创建一个文件夹:lib
- 将dom4j-2.1.1.jar复制到lib文件夹中
- 在jar文件上点击,选择add as library
- 在类中导包使用
Dome4j解析XML-得到Document对象
SAXReader类
| 构造器 | 说明 |
| :-----------------------: | :-------------------------: |
| public SAXReader() | 创建Dom4j的解析器对象 |
| Document read(String url) | 加载XML文件成为Document对象 |Document类
| 方法名 | 说明 |
| :----------------------: | :------------: |
| Element getRootElement() | 获取根元素对象 |使用Dom4j获取根元素
public class demo01 { @Test public void parseXml() throws DocumentException { // 1、创建一个SAXReader解析对象:代表了Dom4j框架 SAXReader saxReader = new SAXReader(); //2、加载xml文件成为Document对象 InputStream is = demo01.class.getResourceAsStream("/Contacts.xml"); Document document = saxReader.read(is); // 3、文档对象获取根元素 Element rootElement = document.getRootElement(); System.out.println(rootElement.getName()); } }
7.2、使用Dom4j解析XML的元素、属性、文本
方法名 | 说明 |
---|---|
List elements() | 得到当前元素下的所有子元素 |
List elements(String name) | 得到当前元素下指定名字的子元素返回集合 |
Elment element(String name) | 得到当前元素下指定名字的子元素,如果有很多名字相同的返回第一个 |
String getName() | 得到元素名字 |
String attributeValue(String name) | 通过属性名直接得到属性值 |
String elementText(子元素名) | 得到指定名称的子元素的文本 |
String getText() | 得到文本 |
代码演示
public class demo01 {
@Test
public void parseXml() throws DocumentException {
// 1、创建一个SAXReader解析对象:代表了Dom4j框架
SAXReader saxReader = new SAXReader();
//2、加载xml文件成为Document对象
InputStream is = demo01.class.getResourceAsStream("/Contacts.xml");
Document document = saxReader.read(is);
// 3、文档对象获取根元素
Element rootElement = document.getRootElement();
System.out.println(rootElement.getName());
}
@Test
public void parseXMLAllNode() throws DocumentException {
// 1、创建一个SAXReader解析对象:代表了Dom4j框架
SAXReader saxReader = new SAXReader();
//2、加载xml文件成为Document对象
InputStream is = demo01.class.getResourceAsStream("/Contacts.xml");
Document document = saxReader.read(is);
//3、提取根元素对象
Element rootElement = document.getRootElement();
//4、提取根元素下的全部一级子元素
List<Element> elements = rootElement.elements();
for (Element element : elements) {
System.out.println(element.getName());
//5、获取属性值
System.out.println(element.attributeValue("id"));
//6、获取文本信息
System.out.println(element.elementText("name"));
//先得到元素对象,再取文本值
Element name = element.element("name");
System.out.println(name.getText());
System.out.println(name.getTextTrim());
}
}
}
8、XPath技术
Xpath技术提供了简洁的方式进行XML信息的检索
- Xpath使用路径表达式来定位XML文档中的元素节点或属性节点
使用Xpath检索出XML文件
- 导入(dom4j和jaxen-1.1.2.jar),Xpath技术依赖Dom4j技术
- 通过dom4j和SAXReader获取Document对象
- 利用Xpath提供的API,结合Xpath的语法完成选取XML文档元素节点进行解析操作
方法名 | 说明 |
---|---|
Node selectSingleNode("表达式") | 获取符合表达式的唯一元素 |
List selectNodes("表达式") | 获取符合表达式的元素集合 |
Xpath的四大检索方案
绝对路径
@Test public void parse01() throws DocumentException { SAXReader saxReader = new SAXReader(); Document document = saxReader.read(XpathDemo.class.getResourceAsStream("/Contacts.xml")); //直接检索 List<Node> nodes = document.selectNodes("/contactList/contact/name"); for (Node node : nodes) { Element element = (Element) node; System.out.println(element.getTextTrim()); } }
相对路径
@Test public void parse02() throws DocumentException { SAXReader saxReader = new SAXReader(); Document document = saxReader.read(XpathDemo.class.getResourceAsStream("/Contacts.xml")); //先得到根元素 Element rootElement = document.getRootElement(); List<Node> nodes = rootElement.selectNodes("./contact/name"); for (Node node : nodes) { Element element = (Element) node; System.out.println(element.getTextTrim()); } }
全文检索
@Test public void parse03() throws DocumentException { SAXReader saxReader = new SAXReader(); Document document = saxReader.read(XpathDemo.class.getResourceAsStream("/Contacts.xml")); /** * //元素 在全文找到这个元素 * //元素1/元素2 在全文找元素1下面的全部元素2 * //元素1//元素2 */ // List<Node> nodes = document.selectNodes("//name"); // List<Node> nodes = document.selectNodes("//contact/name"); List<Node> nodes = document.selectNodes("//contact//name"); for (Node node : nodes) { Element element = (Element) node; System.out.println(element.getTextTrim()); } }
属性查找
@Test public void parse04() throws DocumentException { SAXReader saxReader = new SAXReader(); Document document = saxReader.read(XpathDemo.class.getResourceAsStream("/Contacts.xml")); //获取属性 List<Node> nodes = document.selectNodes("//@id"); for (Node node : nodes) { Attribute attribute = (Attribute) node; System.out.println(node.getName()+":"+attribute.getValue()); } //检索元素,检索contace,带id属性 List<Node> nodeList = document.selectNodes("//contact[@id]"); for (Node node : nodeList) { Element element = (Element) node; System.out.println(element.elementTextTrim("name")); } //检索单个 Node node = document.selectSingleNode("//contact[@id='1']"); Element element = (Element) node; System.out.println(element.elementTextTrim("name")); }