介绍
XML :可扩展标记语言(EXtensible Markup Language)
- 可扩展:标签都是自己定义的。
<apple></apple>
- 标记语言:就是由标签组成的
作用
- 配置文件,保存了一些数据
- 网络数据的交互。将数据保存在xml进行网络交互。(就是定义数据格式(json也可以做网络交互),A公司获取B公司的数据)
xml与html的区别
- xml标签都是自定义,HTML标签是预定义(官方把标签定义好了)。
- xml语法严格,html语法松散。
- xml用来存储数据,html用来展示数据。
xml语法规则
- xml文档后缀名是.xml
- xml第一行必须是文档声明
- xml文档中有且只有一个根标签
- 属性值必须用引号引起来
- 标签必须正确关闭
- 标签名区分大小写
<!--文档声明-->
<?xml version="1.0"?>
<beans>
<bean>abc</bean>
<apple id="apple">apple</apple>
<apple id="apple2">apple2</apple>
</beans>
xml组成部分
<?xml version="1.0" encoding="UTF-8" ?>
<!-- 1. 上面那个是文档声明 -->
<!-- 根标签 -->
<!-- 2.元素 -->
<!-- <bananas></bananas> -->
<!-- 自闭标签 <img /> -->
<!-- 元素体可以是标签,还可以是文本 -->
<!--标签体不能以数字、标点开头-->
<bananas>
<!-- 属性 -->
<banana id="banana">
<!-- 转义字符 -->
<!--
< <
> >
& &
" "
' '
-->
</banana>
</bananas>
xml约束
xml虽然可以自己定义标签属性,但是如果想要做的更好,交互性更强,需要被约束。
有人去定义规范,定义规范的文档就叫约束文档。
常用的约束文档有两种
-
DTD约束
一种简单的约束文档 -
Schema约束
一种复杂的约束文档
定义约束文档的工作一般是由框架的开发者去做,
使用框架的开发者
- 能够在xml中引入约束
- 能够读懂简单的约束文档
约束
就是规定xml文件中根元素的名称,子元素的名称个数,以及属性等信息。
简单说,约束就是定义xml书写规范。
dtd约束
bean.dtd
<?xml version="1.0" encoding="UTF-8"?>
<!--
模拟spring规范,如果开发人员需要在xml使用当前DTD约束,必须包括DOCTYPE。
格式如下:<!DOCTYPE beans SYSTEM "bean.dtd">
-->
<!--
对beans标签的一个规则
beans标签可以包含 bean标签 import标签
* 代表标签可以出现 0 - 无数次
, 代表顺序关系
#PCDATA 可以存在标签体
-->
<!ELEMENT beans (bean*,import*) >
<!ELEMENT bean (property*)>
<!ELEMENT property (#PCDATA)>
<!ELEMENT import (#PCDATA)>
<!--
ATTLIST attributeList 属性列表
id
CDATA 文本类型
REQUIRED 必须存在
-->
<!ATTLIST bean id CDATA #REQUIRED
className CDATA #REQUIRED
>
<!ATTLIST property name CDATA #REQUIRED
value CDATA #REQUIRED
>
<!ATTLIST import resource CDATA #REQUIRED
>
dtdDemo.xml
<?xml version="1.0" encoding="utf-8" ?>
<!-- 引入约束 -->
<!--
beans 被约束的xml的根标签必须是beans
SYSTEM 本地引入
bean.dtd 约束文件的位置
-->
<!DOCTYPE beans SYSTEM "bean.dtd">
<beans>
<bean id="" className=""></bean>
</beans>
schema约束
-
dtd约束文档可以自己定义约束;schema约束文档本身就被
w3c官方约束
,文件后缀名为.xsd
-
相比dtd,较新的一种约束
-
语法更严格,数据类型更多
-
较为复杂,语法规范比较多
bean-schema.xsd
<?xml version="1.0" encoding="UTF-8"?>
<!--
模拟spring规范,如果开发人员需要在xml使用当前Schema约束,必须包括指定命名空间。
格式如下:
<beans xmlns="http://www.itcast.cn/bean"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.itcast.cn/bean bean-schema.xsd" >
targetNamespace 给自己的约束起名
第一层element代表根标签,beans
complexType 复杂类型
simpleType 简单类型
choice 选择结构 里面声明的元素,没有顺序要求
sequence 顺序结构 里面声明的元素,有顺序要求
minOccurs="0" maxOccurs="unbounded" 标签可以出现 0-n 次
-->
<schema xmlns="http://www.w3.org/2001/XMLSchema"
targetNamespace="http://www.cast.cn/bean"
elementFormDefault="qualified"> <!-- 声明根标签 -->
<element name="beans">
<complexType>
<choice minOccurs="0" maxOccurs="unbounded">
<element name="bean">
<complexType>
<sequence minOccurs="0" maxOccurs="unbounded">
<element name="property">
<complexType>
<attribute name="name" use="required"></attribute>
<attribute name="value" use="required"></attribute>
</complexType>
</element>
</sequence>
<attribute name="id" use="required"></attribute>
<attribute name="className" use="required"></attribute>
</complexType>
</element>
<element name="import">
<complexType>
<attribute name="resource" use="required"></attribute>
</complexType>
</element>
</choice>
</complexType>
</element>
</schema>
schema-demo.xml
<?xml version="1.0" encoding="UTF-8" ?>
<!--
xmlns ns namespace 名称空间
xmlns:xsi 规范
xsi:schemaLocation 约束文件的位置
-->
<beans xmlns="http://www.cast.cn/bean"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.cast.cn/bean bean-schema.xsd">
<import resource=""/>
<import resource=""/>
<bean id="" className="">
<property name="" value=""/>
</bean>
<bean id="" className=""></bean>
</beans>
xml解析
常见的解析方式
-
dom解析
将整个xml文档加载到内存中,形成树状结构 – document文档对象
优点:结构清晰明了,可以做增删改。
缺点:文档过大会造成内存溢出。
开发中常用
这种解析方式。 -
sax解析
逐行扫描,一行一行解析。
速度快,但是没有结构。 -
pull解析
类似sax解析,安卓中内置的解析方式。
常见的解析开发包
能解析xml的同时也可以处理html
- JAXP:sun公司提供支持DOM和SAX开发包
- JDom:dom4j兄弟
- jsoup:一种处理HTML特定解析开发包
- dom4j:比较常用的解析开发包,hibernate底层采用
dom4jAPI
<dependency>
<groupId>dom4j</groupId>
<artifactId>dom4j</artifactId>
<version>1.6.1</version>
</dependency>
// 加载执行xml文档
Document read(…)
// 获得根元素
Element getRootElement()
// 获得指定名称的所有子元素。可以不指定名称
elements(…)
// 获得指定名称第一个子元素。可以不指定名称
element(…)
// 获得当前元素的元素名
getName()
// 获得指定属性名的属性值
attributeValue(…)
// 获得指定名称子元素的文本值
elementText(…)
// 获得当前元素的文本内容
getText()
demo
bean.xml
<?xml version="1.0" encoding="UTF-8"?>
<beans>
<bean id="001" className="cn.cast.demo.User">
<property name="user" value="jacl"></property>
<property name="user" value="rose"></property>
</bean>
<bean id="002" className="cn.cast.demo.Admin">
<property name="user" value="admin"></property>
<property name="user" value="write"></property>
</bean>
</beans>
package com.example;
import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.Element;
import org.dom4j.io.SAXReader;
import java.util.List;
public class Dom4jTest {
public static void main(String[] args) throws DocumentException {
// 创建用于读取xml文件的流
SAXReader saxReader = new SAXReader();
// 将xml文件加载到内存中,并返回document对象
Document document = saxReader.read("maven-demo\\bean.xml");
// 获取根元素
Element rootElement = document.getRootElement();
// 获取所有子元素
List<Element> elements = rootElement.elements();
// 遍历得到每一个bean元素
for (Element beanElement : elements) {
String className = beanElement.attributeValue("className");
System.out.println(className);
List<Element> propertyEleList = beanElement.elements();
for (Element propertyEle : propertyEleList) {
String name = propertyEle.attributeValue("name");
String value = propertyEle.attributeValue("value");
System.out.println(name);
System.out.println(value);
}
}
}
}
xpath
xpath是用来找标签的,也可以用来找html标签
<?xml version="1.0" encoding="UTF-8" ?>
<students>
<student number="heima_0001">
<name id="itcast">
<xing>张</xing>
<ming>三</ming>
</name>
<age>18</age>
<sex>male</sex>
</student>
<student number="heima_0001">
<name id="itheima">
<xing>张</xing>
<ming>四</ming>
</name>
<age>18</age>
<sex>male</sex>
</student>
<student number="heima_0002">
<name>jack</name>
<age>18</age>
<sex>female</sex>
</student>
</students>
package com.itheima.xpath;
import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.Node;
import org.dom4j.io.SAXReader;
import java.util.List;
/*
xpath 就是用来找标签的。
*/
public class XpathDemo {
public static void main(String[] args) throws Exception {
//1:创建输入流 将xml读取到内存中形成一个document对象
SAXReader saxReader = new SAXReader();
Document document = saxReader.read("xml\\student.xml");
// document selectNodes(xpath表达式)
//查询所有student标签
List<Node> list = document.selectNodes("//student");
// list.forEach(System.out::println);
// for (Node node : list) {
// System.out.println(node);
// }
// 查询所有student标签下的name标签
List<Node> list2 = document.selectNodes("//student/name");
// list2.forEach(System.out::println);
// 查询student标签下带有id属性的name标签
List<Node> list3 = document.selectNodes("//student/name[@id]");
//
// list3.forEach(System.out::println);
// 查询student标签下带有id属性的name标签 并且 id为 itcast
List<Node> list4 = document.selectNodes("//student/name[@id='itcast']");
list4.forEach(System.out::println);
}
}
“这一块是海马体,正在萎缩,意味着她剩下的记忆越来越少。阿尔茨海默症使得大脑中的某种蛋白物质分泌过多,最后这个物质会弥漫到她整个大脑,直到什么都不记得了。”陈玉拿出她买的脑科学书,翻到一页彩色的大脑图,指着最中间的小小一块,想象妈妈大脑中正在发生的病变。
https://new.qq.com/omn/20220329/20220329A0AQ0000.html?pgv_ref=aio2015&ptlang=2052