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 |
得到当前元素下的所有子元素 |
List |
得到当前元素下指定名字的子元素返回集合 |
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 |
获取符合表达式的元素集合 |
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"));
}
原文始发于微信公众号(小林学编程):XML详讲
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/219430.html