Java-JavaWeb-XML
- 简介
- extensible markup language可扩展标记型语言
- 可扩展:标签可以自定义,也可以写中文标签
- 主要用于存储数据
- 不同系统之间传输数据
- 描述相互间有关系的数据
- 常用于配置文件
- extensible markup language可扩展标记型语言
- 语法
- 文档声明
- <?xml version="1.0" encoding="gbk"?>
- 必须写在第一行第一列
- 属性:
- version 值:1.0 1.1
- encoding 值:gbk utf-8 iso8859-1(不包含中文)
- 非常用属性:
- standalone
- 值:yes\no
- 是否需要其他文档
- standalone
- <?xml version="1.0" encoding="gbk"?>
- 标签的定义
- 类似Js
- 一个XML中,有且只有一个根标签,其他标签都是这个标签下面的标签
- 标签的内容:空格和换行会被当作代码内容解析
- 标签名规则
- 区分大小写
- 不能以数字或下划线开头作为标签名
- 不能以XML、xml等开头
- 标签名中不能包含空格和冒号
- 属性的定义
- 一个标签上可以有多个属性,多个属性名不能重复
- 属性与值之间使用=连接,值使用双引号括起,单引号也可以
- 命名规则与XML的标签名命名规则一致
- 注释
- <!-- 注释-->
- 注释不能有嵌套
- 转义字符
- < <
- > >
- " "
- ' &aqos;
- & &
- CDATA
- 内部内容无需转义
- <![CDATA[ 内容 ]]>
- PI 指令
- 用于在XML中设置样式
- 格式:第2行写:<?xml-stylesheet type="text/css" href="1.css"?>
- 对中文标签不起作用
- 文档声明
- XML的约束
- 用于添加对标签内容的约束(拒绝随意添加标签,如在人的属性中添加猫)
- dtd约束
- 定义 .dtd文件
- 分析XML中有几个元素,对应dtd文件中的多少个<!ELEMENT>
- 分析XML中的元素是复杂元素(有子元素)\简单元素(无子元素)
- 复杂元素的约束:
- <!ELEMENT person (name,age)>
- 简单元素的约束:
- <!ELEMENT name (#PCDATA)>
- <!ELEMENT age (#PCDATA)>
- 复杂元素的约束:
- 引入dtd约束
- 引入 .dtd文件
- <!DOCTYPE 根元素名称 SYSTEM “dtd文件的路径">
- XML文件内直接写
- <!DOCTYPE 根元素名称 [dtd语言]>
- 引入外部dtd文件(网络文件)
- <!DOCTYPE 根元素名称 PUBLIC "dtd名称" "dtd文档的URL">
- 引入 .dtd文件
- 定义dtd元素
- 语法:<!ELEMENT 元素名 约束>
- 简单元素(没有子元素)
- <!ELEMENT 元素名 约束>
- 约束有:
- (#PCDATA) 限制为字符串类型
- EMPTY 无内容
- ANY 任意类型
- 约束有:
- <!ELEMENT 元素名 约束>
- 复杂元素(有子元素)
- <!ELEMENT 元素名称 (子元素名称)>
- 子元素之间使用 , 隔开,那么子元素之间出现的顺序要与此一致
- 子元素之间使用 | 隔开,那么子元素只能出现其中的任意一个
- 用以下符号表示元素出现的次数
- + 出现1次或者多次
- ? 出现0次或者1次
- * 出现0次或者多次
- <!ELEMENT 元素名称 (子元素名称)>
- 定义dtd属性
- 格式:<!ATTLIST 元素名称 属性名称 属性类型 属性的约束>
- 例:<!ATTLIST name ID CDATA #REQUIRED>
- 属性类型:
- CDATA 字符串
- 枚举 (A|B|C|D) 表示该属性必须在ABCD中取值
- ID 只能是字母或者下划线开头
- 属性的约束:
- #REQUIRED该属性必须出现
- #IMPLIED该属性可有可无
- #FIXED"A" 该属性的值必须是A
- 直接值 若在属性的约束 这个位置写"AA" 那么该属性如果不明确值的话,就会取值AA
- 格式:<!ATTLIST 元素名称 属性名称 属性类型 属性的约束>
- 定义dtd实体
- 格式:<!ENTITY TEST "HAHA"> <name>&TEST;</name>就可以将HAHA引入
- 一般需要写在内部dtd文件中,外部文件中的实体的话,某些浏览器不支持
- 定义 .dtd文件
- schema约束
- 符合XML语法,XML语句
- 一个XML中,可以有多个schema约束,使用名称空间进行区分,类似Java的包
- 支持更多的数据类型,比如整数类型等,并支持自定义类型
- 创建schema
- 创建schema文件,后缀:xsd,其本身就是XML文件,第一行第一列要写XML的声明
- 根节点<schema>,这个标签具有以下属性:
- xmlns:值:http://www.w3.org/2001/XMLSchema 表示本XML文件是一个schema约束文件
- targetNamespace:
- elementFormDefault:值:qualified
- schema语法
- 约束元素
- <element name="person"> //复杂元素,含有子元素
- <complexType>
- <sequence>//表示元素按照以下顺序出现,另外还有其他约束,如:
- //<all>表示只能出现一次
- //<choice>表示只能出现以下元素中的一个
- <element name="name" type="string"></element> //简单元素,无子元素
- //可以在这个标签上添加属性:maxOccurs="unbounded" 表示无出现次数的限制
- <element name="age" type="int"></element> //简单元素
- </sequence>
- </complex>
- </element>
- <element name="person"> //复杂元素,含有子元素
- 约束属性
- 书写位置:复杂元素标签包含的范围里,且在</coplexType>标签之前
- 格式:<attribute name="id" type="int" use="required"></attribute>
- name:属性名\ type:属性类型\ use:属性是否必须出现
- 约束元素
- 引入schema约束
- 在XML文件的根元素上添加以下属性:
- xmlns:xsi 值:xxx-instance
- xsi只是自定义的一个别名,用于与下方的属性区别开,也用在引入了多个schema文件的情况,相当于给schema约束起名字
- xxx就是schema文件中xmlns的值
- xmlns
- 它的值就是schema文件的targetNameSpace的值
- xsi:schemalocation
- 它的值的构成:targetNameSpace的值 空格 schema文档的路径
- xmlns:xsi 值:xxx-instance
- 在XML文件的根元素上添加以下属性:
- XML的解析
- 2中解析方式:DOM SAX
- DOM
- 在内存中分配一个树形结构,将XML的每一个结构,都封装成对象,类似于Js对HTML的DOM操作
- 很方便进行增删改操作
- 文件很大时,可能造成内存溢出
- SAX
- 事件驱动,边读边解析,读到某个对象,就将此对象返回
- 不能实现增删改,只能查询
- 不会造成内存溢出
- XML解析器
- sun公司 jaxp
- dom4j组织 dom4j (实际开发中使用)
- jdom组织 jdom
- jaxp
- JavaSE的一部分,在 javax.xml.parsers包中
- 针对DOM
- 类:DocumentBuilder\DocumentBuilderFactory\Document\Node
- 当对XML增删改的操作时,需要回写操作,使用:
- Transformer\TransformerFactory\DOMSource\StreamResult
- 针对SAX
- 类:SAXParser\SAXParserFactory
- 步骤
- 1-创建解析器工厂
- 2-创建解析器
- 3-执行parse()方法
- 2个参数,xml路径+事件处理器(自定义一个类继承DefaultHandler,并覆写以下3个方法)
- 事件处理器:
- 当解析到开始标签时,自动调用startElement方法,返回标签名
- qName就是标签名,可以对其进行各种操作
- 当解析到文本内容时,自动调用characters方法,返回内容
- 当解析到结束标签时,自动执行endElement方法,返回标签名
- 当解析到开始标签时,自动调用startElement方法,返回标签名
- 针对DOM
- JavaSE的一部分,在 javax.xml.parsers包中
- dom4j
- 逐行解析
- 结合了dom和sax,既可以增删改,也可以查询
- 不是JavaSE的一部分,如何导入dom4j的jar包?
- 在MyEclipse环境:
- 项目目录中创建一个lib文件夹
- 复制jar包至lib文件夹
- 右键点击此jar包->build path->add to build path
- 导入成功
- 在MyEclipse环境:
- 一般步骤
- 创建解析器
- SAXReader reader=new SAXReader();
- 得到document
- Document doc=reader.read(url)
- Document类的父接口是Node
- 得到根节点 getRootElement(),返回的是Element
- 多种获取节点的方法
- Element中有一个getParent()方法
- addElement()
- setText()
- 当对XML实施了增删改的操作后,需要回写操作,使用XMLWriter
- 当需要创建一个元素时,可以使用DocumentHelper类中的静态方法createElement()方法
- 当需要向某个位置上添加元素时,可以获取同辈元素的集合list,使用list的add()方法,添加后会自动影响document对象
- 创建解析器
- XPATH
- 可以直接获取某一个元素,不再需要逐行去解析
- 常用语法:
- /AAA/BBB/CCC
- AAA下的BBB下的CCC
- //BBB
- 所有的BBB元素
- /*
- 所有元素
- /AAA[1]
- AAA下的第一个元素
- /AAA[last()]
- AAA下的最后一个元素
- //AAA[@ID]
- 选择具有ID属性的元素
- /AAA/BBB/CCC
- 需要导入jar包,dom4j里提供了方法,可以应用xpath的表达式
- selectNodes(xpath表达式)
- selectSingleNode(xpath表达式)