2019独角兽企业重金招聘Python工程师标准>>>
1、什么是xml
全称EXtensible Markup Language ,即可扩展标记语言 。在设计之初,用来替代HTML,并可以传输和存储数据 ,目前主要用于框架的配置文件 ,XML标签没有被预定义,需要用户自行定义标签 。
2、xml语法
书写规范
- 所有XML元素都须有闭合标签
- XML标签对大小写敏感
- 标签必须正确的嵌套
- 一个XML文档有且仅有一个根标签
- 属性值必须使用引号引起来
- 标签名不能以xml(不管是大写还是小写)开头
XML文档的组成
声明:
<?xml version="1.0" encoding="utf-8"?>
- 作用: 声明本文件是一个XML文件
- 必须出现在第一行第一列
- 必须以<?xml 开头 以?>结束
- 文档声明常见的两个属性: version="1.0"指定文档版本 encoding="utf-8"指定当前文档的编码
元素:
- 普通元素的结构由开始标签,元素体,结束标签组成;例如:<hello>你好</hello>
- 元素体:可以是元素也可以是文本
- 空元素:只有开始标签,没有结束标签,元素必须自己闭合;
- 元素命名:区分大小写;不能使用空格;不能使用冒号;不建议以xml开头;
- 标签体中的空格/换行/制表符都是有意义的
属性:
- 和HTML标签的属性一样,直接写在标签中.需要注意的是,属性值需要用引号引起来
- 属性名不能使用空格、冒号等特殊字符,且必须以字母开头
注释:
和HTML一样<!-- -->
.在Eclipse中的快捷键是: Ctrl + Shift + /
转义CDATA:<![CDATA[ 任意内容 ] ]>
- 全称 : Character Data,因为很多符号已经被xml文档结构所使用,所以在元素体或属性值中想使用这些符号就必修进行转义,例如:< 、> 、 ’ 、" 、 &
- 作用 : 如果要输出的内容中包含标签,可以使用CDATA区. 例如下面代码中的
<html>
会被作为普通文本内容解析<![CDATA[我会<html>]]>
3、xml约束
约束的作用 : 规范XML文件的书写(文档中能用哪些标签、哪些属性,以及顺序等)
常见的约束
- DTD
- Schema
DTD约束
全称:Document Type Definition,文档类型定义
常用语法
-
元素声明
- 语法1 : <!ELEMENT 元素名称 (元素内容)>
- 示例1 : <!ELEMENT servlet-mapping (servlet-name,url-pattern) >
- 语法2 : <!ELEMENT 元素名称 类别>
- 示例2 : <!ELEMENT servlet-name (#PCDATA)>
-
属性声明
- 语法 : <!ATTLIST 元素名称 属性名称 属性类型 默认值>
- 示例 : <!ATTLIST web-app version CDATA #IMPLIED> #IMPLIED表示该属性可选,#REQUIRED表示该属性必选
-
特殊符号
- 星号*出现任意次数
- 问号?出现0次或1次
- 加号+出现至少一次
- 逗号,代表顺序
- 竖线|代表或者
- 括号()代表分组
-
DTD文件和XML文件的关联方式
-
内部关联 :
-
DTD和XML写在同一个文件中
-
语法 : <!DOCTYPE web-app [约束内容]>
-
-
外部关联_系统关联
-
DTD和XML分别为一个文件.但是都在本地
-
语法 : <!DOCTYPE 根标签名 SYSTEM "DTD文件的本地路径" >
-
-
外部关联_公共关联
-
DTD和XML分别为一个文件.但是DTD文件在网络上
-
语法 : <!DOCTYPE 根标签名 PUBLIC "DTD名称" "DTD的URL">
-
-
-
开发中如何关联
-
打开DTD约束文件,查找文件顶部以<!DOCTYPE开头的声明
-
将这一段声明拷贝到自己的XML文件中
-
如果使用外部公共关联方式,但是电脑没有联网,需要手动将其修改为外部系统关联
-
Schema约束
特点 : 比DTD更加强大,约束力更强,而且可以引入多个约束文件
开发中如何关联
-
找到约束文件中声明的根标签
-
在新建的xml文件中创建该根标签
-
在根标签的开始标签中按Alt + / ,选择xsinp,该字段用于声明本文档受Schema的约束
-
在根标签的开始标签中按Alt + / ,选择default namespace,该字段的值=约束文件顶部的约束声明中targetNamespace字段的值
-
在根标签的开始标签中按Alt + / ,选择schemaLoc,{namespace}字段的值=约束文件顶部的约束声明中targetNamespace字段的值, {location}字段的值=约束文件的路径.两个字段之间要有空格</font>
<web-app xmlns="http://www.example.org/web-app_2_5" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://www.example.org/web-app_2_5 web-app_2_5.xsd"version="2.5">
5、xml解析
常见的解析方式:
1、DOM:要求解析器把整个xml文档装载到内存,并解析成一个Document对象。
优点:元素与元素之间保留结构关系,可以进行增删改查操作。
缺点:xml文档过大,可能出现内存溢出现象。
2、SAX:是一种速度更快,更有效的方法。它逐行扫描文档,一边扫描一边解析。并以事件驱动的方式进行具体解析,每执行一行,都将触发对应的事件。
优点:处理速度快,可以处理大文件
缺点:只能读,逐行后将释放资源
3、PULL:Android内置的xml解析方式,类似SAX。
常见的解析开发包:
-
JASP : Sun官方提供,同时支持DOM和SAX
-
jsoup : 处理的HTML解析器
-
JDOM : dom4j的兄弟
-
dom4j : 应用广泛,例如Hibernate
dom4j解析
-
主页 : dom4j
-
使用步骤
-
新建工程,导入DOM4J的jar包.如果是普通Java工程,需要手动Build Path
-
创建解析器SAXReader
-
加载文档,获取Document对象
-
通过Document对象获取文档的根节点
-
通过根节点获取所有子节点
-
遍历所有节点
public static void main(String[] args) throws Exception {// 1.创建解析器SAXReader saxReader = new SAXReader();InputStream is = DOM4JTest.class.getClassLoader().getResourceAsStream("web.xml");// 2.读取文档Document document = saxReader.read(is);// 3.获取根节点Element rootElement = document.getRootElement();// 4.获取所有子节点List<Element> elements = rootElement.elements();// 5.遍历所有子节点for (Element element : elements) {// 获取标签的名字String name = element.getName();// 获取标签中的值String text = element.getText();System.out.println(name + "===" + text);}}// 递归,获取所有节点的name和值public static void iterate(Element rootElement) {if (rootElement == null) {return;}// 获取所有子节点List<Element> elements = rootElement.elements();// 遍历for (Element element : elements) {String name = element.getName();String text = element.getTextTrim();System.out.println(name + "===" + text);// 递归调用iterate(element);}}
-
XPath的使用
-
如果XML文档比较复杂,使用DOM4J查找节点的时候会非常麻烦,这时可以使用XPath快速定位节点
-
使用步骤
-
新建工程,导入dom4j和jaxen两个jar包.如果是普通Java工程,需要手动Build Path
-
创建解析器SAXReader
-
加载文档,获取Document对象
-
通过Document对象的selectNodes()和selectSingleNode()方法查找对应的节点
public void testXpath() throws Exception {// 1.创建解析器SAXReader saxReader = new SAXReader();InputStream is = DOM4JTest.class.getClassLoader().getResourceAsStream("web.xml");// 2.加载文档Document document = saxReader.read(is);// 3.通过XPath语法查找所有名字为servlet-class的节点List<Node> list = document.selectNodes("//servlet-class");// 4.遍历for (Node node : list) {// 因为已经知道servlet-class为元素,所以强制转换为ElementElement element = (Element) node;String text = element.getText();System.out.println(text);} }public void testXpath2() throws Exception {// 1.创建解析器SAXReader saxReader = new SAXReader();InputStream is = DOM4JTest.class.getClassLoader().getResourceAsStream("web.xml");// 2.加载文档Document document = saxReader.read(is);// 3.通过XPath语法查找web-app节点中,第一个servlet节点中的servlet-class节点Element element = (Element) document.selectSingleNode("/web-app/servlet[1]/servlet-class");System.out.println(element.getText()); }
-