可扩展标记语言
它是一种标记语言 很类似HTML,HTML文件也是XML文档
XML 与 HTML 区别差异
1.xml标签都是自定义,html标签是预定义
2.xml语法严格,html语法松散
3.xml是存储数据的,html是展示数据
存储数据格式:
<?xml version="1.0" encoding="UTF-8" ?> <students> <student id="001"> <name>大珍珠</name> </student> <student id="002"> <name>小珍珠</name> </student> </students>配置文件格式:
<?xml version="1.0" encoding="UTF-8" ?> <beans> <bean classname="com.dzz.bean.User"> <property name="username" value="jack"></property> </bean> </beans>xml注意点事项:
标签由一对尖括号+合法标识符组成 <student>
标签必须成对出现 <student></student>
特殊的标签可以不成对称自闭和标签,但是必须有结束标记 <address/>
标签中可以定义属性,属性和标签名空格隔开属性值必须用引号引起来
<student id="1" name="大珍珠"></student>
标签嵌套
<student id="1">
<name>大珍珠</name>
</student>
xml规则:
xml文件后缀名:xml
文档声明必须是第一行第一列(定格)
version:版本
encoding:字符编码
必须存在根标签,有且只能有一个
注释:
ctrl+shift+/
特殊字符:
方式一 转译:
< < 小于
> > 大于
& & 和号
' ' 单引号
" " 引号
方式二 DATA区:
<![CDATA[ …内容… ]]> IDEA:CD生成
XML约束主要分2类 DTD 和 Schema 两种约束技术,用来限定xml文件可使用的标签以及属性,也就是告诉程序员xml如何编写
DTD约束
引入DTD约束
1.引入本地dtd
<!DOCTYPE 根元素名称 SYSTEM "DTD文件的路径">
2.在xml文件内部引入
<!DOCTYPE 根元素名称 [ dtd文件内容 ]>
3.引入网络dtd
<!DOCTYPE 根元素的名称 PUBLIC "DTD文件名称" "DTD文档的URL">
<?xml version="1.0" encoding="UTF-8"?> <!-- 传智播客DTD教学实例文档。 模拟spring规范,如果开发人员需要在xml使用当前DTD约束,必须包括DOCTYPE。 格式如下: <!DOCTYPE beans SYSTEM "bean.dtd"> --> <!ELEMENT beans (bean*,import*) > <!ELEMENT bean (property*)> 复杂元素: 直接写子元素名称。 多个子元素可以使用","或者"|"隔开; ","表示定义子元素的顺序 ; "|": 表示子元素只能出现任意一个 简单元素: EMPTY: 表示标签体为空 ANY: 表示标签体可以为空也可以不为空 PCDATA: 表示该元素的内容部分为字符串 <!ELEMENT property (#PCDATA)> 属性的类型: CDATA类型:普通的字符串 <!ELEMENT import (#PCDATA)> <!ATTLIST bean id CDATA #REQUIRED className CDATA #REQUIRED > 属性的约束: #REQUIRED: 必须的 #IMPLIED: 属性不是必需的 #FIXED value:属性值是固定的 <!ATTLIST property name CDATA #REQUIRED value CDATA #REQUIRED > <!ATTLIST import resource CDATA #REQUIRED>
Schema约束
引入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" >解析原理图
Schema和dtd的区别
1. schema约束文件也是一个xml文件,符合xml的语法,这个文件的后缀名.xsd
2.一个xml中可以引用多个schema约束文件,多个schema使用名称空间区分(名称空间类似于java包名)
3.dtd里面元素类型的取值比较单一常见的是PCDATA类型,但是在schema里面可以支持很多个数据类型
4.schema语法更加的复杂
dom4j解析
/* 第三方工具(jar包)dom4j: 作用: 以dom的方式,解析xml文件 使用: 1.导入jar包 2.api的介绍 SaxReader类 空参构造: public SaxReader(){} 可以直接创建对象 public Document read(InputStream is): 加载xml文档到内存,生成一个Document对象 public Element getRootElement(): 获得根元素 public List<Element> elements(…): 获得指定名称的所有子元素。可以不指定名称 public String attributeValue(String attributeName): 获得指定属性名的属性值 public String getText(): 获得当前元素的文本内容 解析xml文件的步骤: 1.创建dom4j核心类SaxReader类的对象 2.dom4j核心类SaxReader类的对象调用read方法,加载xml文件获取对应的Document对象 3.获取根标签beansElement 4.获取根标签beansElement中的所有bean子标签,存储List集合对象beanElements 5.增强for遍历List集合对象beanElements 5.1 循环内部获取当前bean标签的id和className的属性值 5.2 循环内部输出5.1中获取的属性值 5.3 获取当前bean标签的所有property子标签,存储List集合对象propertyElements 5.4 增强for遍历List集合对象propertyElements 5.4.1 循环内部获取当前property标签的name和value的属性值,以及文本内容 5.4.2 循环内部输出5.4.1中获取的属性值及文本内容 */ public class Demo01ParseXml { public static void main(String[] args) throws Exception { //1.创建dom4j核心类SaxReader类的对象 SAXReader saxReader = new SAXReader(); //使用类加载器获取xml文件对应的字节输入流对象 InputStream is = Demo01ParseXml.class.getClassLoader().getResourceAsStream("beans.xml"); //2.dom4j核心类SaxReader类的对象调用read方法,加载xml文件获取对应的Document对象 Document document = saxReader.read(is); //3.获取根标签beansElement Element beansElement = document.getRootElement(); //4.获取根标签beansElement中的所有bean子标签,存储List集合对象beanElements List<Element> beanElements = beansElement.elements(); //5.增强for遍历List集合对象beanElements for (Element beanElement : beanElements) { //5.1 循环内部获取当前bean标签的id和className的属性值 String id = beanElement.attributeValue("id"); String className = beanElement.attributeValue("className"); //5.2 循环内部输出5.1中获取的属性值 System.out.println(id + "::::" + className); //5.3 获取当前bean标签的所有property子标签,存储List集合对象propertyElements List<Element> propertyElements = beanElement.elements(); //5.4 增强for遍历List集合对象propertyElements for (Element propertyElement : propertyElements) { //5.4.1 循环内部获取当前property标签的name和value的属性值,以及文本内容 String name = propertyElement.attributeValue("name"); String value = propertyElement.attributeValue("value"); String text = propertyElement.getText(); //5.4.2 循环内部输出5.4.1中获取的属性值及文本内容 System.out.println("\t\t" + name + "-----" + value + "-----" + text); } } is.close(); } }使用dom4j支持xpath解析
/* 第三方工具(jar包)XPath: 作用: 快速查找xml文件中的一个/多个节点 注意: 必须依赖于dom4j 使用: 1.导入jar包 2.api的介绍 SAXReader类 空参构造: public SAXReader(){} 可以直接创建对象 public Document read(InputStream is): 加载xml文档到内存,生成一个Document对象 public List<Node> selectNodes("xpath表达式"),用来获取多个节点 public Node selectSingleNode("xpath表达式"),用来获取一个节点 xpath表达式常用查询形式 1.//AAA//DDD//BBB: 表示一层一层的,AAA下面 DDD下面的BBB 2.//BBB: 表示和这个名称相同,表示只要名称是BBB 都得到 BBB指的是标签名 3./*: 所有元素 4.查看第一个/最后一个元素 BBB[1]:表示第一个BBB元素 BBB[last()]:表示最后一个BBB元素 5.//BBB[@id]: 表示只要BBB元素上面有id属性 都得到 6.//BBB[@id='b1'] 表示元素名称是BBB,在BBB上面有id属性,并且id的属性值是b1 练习: 1.查询所有student标签 2.查询所有student标签下的name标签 3.查询student标签下带有id属性的name标签 4.查询student标签下带有id属性的name标签 并且id属性值为itcast */ public class Demo02XPathXml { public static void main(String[] args) throws Exception { //创建dom4j核心类的对象 SAXReader saxReader = new SAXReader(); //使用类加载器获取xml文件的对应的字节输入流对象 InputStream is = Demo02XPathXml.class.getClassLoader().getResourceAsStream("students.xml"); //加载xml文件获取对应的Document对象 Document document = saxReader.read(is); //1.查询所有student标签 List<Node> nodeList = document.selectNodes("//student"); //遍历 for (Node node : nodeList) { System.out.println(node); } System.out.println("--------------"); //2.查询所有student标签下的name标签 nodeList = document.selectNodes("//student//name"); //遍历 for (Node node : nodeList) { System.out.println(node); } System.out.println("--------------"); //3.查询student标签下带有id属性的name标签 Node node = document.selectSingleNode("//student//name[@id]"); System.out.println(node); System.out.println("--------------"); //4.查询student标签下带有id属性的name标签 并且id属性值为itcast node = document.selectSingleNode("//student//name[@id='itcast']"); System.out.println(node); } }