大纲:
- XML解析
- 引入
- 重点
- DOM解析
- SAX解析
- DOM解析 VS SAX解析
- xPath技术
- 引入
- xPath作用
- dom4j中使用xPath技术
- xPath语法
- XML约束
- 引入
- DTD
- 导入DTD的方式
- DTD语法
- Schema
- 名称空间
@XML解析
1) 引入
程序读取或操作xml文档,叫xml解析。
XML解析又分为两类,DOM解析与SAX解析。
-
基于DOM解析原理的工具:
-
JAXP (Oracle-Sun公司官方)
-
JDOM工具(非官方)
-
Dom4J工具(非官方)(最常用,性能最好)
三大框架(默认读取xml的工具就是Dom4j) -
.......
-
基于SAX解析原理的工具:
-
Sax解析工具(oracle-sun公司官方)
2) 重点
1 DOM解析
- 原理:
xml解析器一次性把整个xml文档加载进内存,然后在内存中构建一颗Document的对象树,通过Document对象,得到树上的节点对象,通过节点对象访问(操作)到xml文档的内容。
- Dom4j解析工具
- 读入xml文档的方法
- 读取xml文档:
Document doc = new SAXReader().read("xml文件");
- 读取节点:
nodeIterator(); 所有节点 - 读取标签:
element("名称") 指定名称的第一个子标签对象
elementIterator("名称"); 指定名称的所有子标签对象
elements(); 所有子标签对象
- 读取属性:
attributeValue(“名称”) 指定名称的属性值
attribute("名称") 指定名称的属性对象
getName() 属性名称
getValue() 属性值
atributeIterator() 所有属性对象(Iterator)
attributes() 所有属性对象(List)
- 读取文本:
getText() 得到当前标签的文本
elementText("子标签名称") 得到子标签的文本
- 修改xml文档的方法
- 写出内容到xml文档
XMLWriter writer = new XMLWriter(OutputStream, OutputForamt)
wirter.write(Document);
- 修改xml文档的API
- 增加:
DocumentHelper.createDocument() 增加文档
addElement("名称") 增加标签
addAttribute("名称",“值”) 增加属性
- 修改:
Attribute.setValue("值") 修改属性值
Element.addAtribute("同名的属性名","值") 修改同名的属性值
Element.setText("内容") 修改文本内容
- 删除
Element.detach(); 删除标签
Attribute.detach(); 删除属性
2 SAX解析
SAX解析工具由Sun公司提供的,内置在jdk的org.xml.sax.*中。
核心的API:
- SAXParser类: 用于读取和解析xml文件对象。
- parse(File f, DefaultHandler dh)方法: 解析xml文件
- 参数一: File:表示 读取的xml文件。
- 参数二: DefaultHandler: SAX事件处理程序。
-
创建SAXParser对象
SAXParser parser = SAXParserFactory.newInstance().newSAXParser(); -
调用parse方法
parser.parse(new File("./src/contact.xml"), new MyDefaultHandler());
//注:MyDefaultHandler类是DefaultHandler类的子类,由自己编写! -
DefaultHandler
-
DefaultHandler类的API:
- void startDocument() : 在读到文档开始时调用
- void endDocument() :在读到文档结束时调用
- void startElement(String uri, String localName, String qName, Attributes attributes) :读到开始标签时调用
- void endElement(String uri, String localName, String qName) :读到结束标签时调用
- void characters(char[] ch, int start, int length) : 读到文本内容时调用
3 DOM解析 VS SAX解析(*面试题)
方面 | DOM解析 | SAX解析 |
---|---|---|
原理 | 一次性加载xml文档,不适合大容量的文件读取 | 加载一点,读取一点,处理一点。适合大容量文件的读取 |
读写 | 读写 | 只读 |
方向 | 任意读取任何位置的数据,甚至往回读 | 从上往下,按顺序读取,不能往回读 |
方式 | 面向对象的编程方法(Node、Element、Attribute), Java开发者编码比较简单 | 基于事件的编程方法 , java开发编码相对复杂 |
@xPath技术
)1 引入
问题:当使用dom4j查询比较深的层次结构的节点(标签,属性,文本),比较麻烦!
)2 xPath作用
主要是用于快速获取所需的节点对象。
)3 Dom4j中使用xPath技术
- 导入xPath支持jar包 。 jaxen-1.1-beta-6.jar
- 使用xpath方法
List<Node> selectNodes("xpath表达式"); 查询多个节点对象
Node selectSingleNode("xpath表达式"); 查询一个节点对象
)4 xPath语法
符号 | 意义 | 作用 |
---|---|---|
/ | 绝对路径 | 表示从xml的根位置开始或子元素(一个层次结构) |
// | 相对路径 | 表示不分任何层次结构的选择元素 |
* | 通配符 | 表示匹配所有元素 |
[] | 条件 | 表示选择什么条件下的元素 |
@ | 属性 | 表示选择属性节点 |
and | 关系 | 表示条件的与关系(等价于&&) |
text() | 文本 | 表示选择文本内容 |
@XML约束
)1 引入
- XML语法:
规范的xml文件的基本编写规则。(由w3c组织制定的)
- XML约束:
规范XML文件数据内容格式的编写规则。(由开发者自行定义)
- XML约束技术
- DTD约束:
语法相对简单,功能也相对简单。学习成本也低。 - Schema约束:
语法相对复杂,功能也相对强大。学习成本相对高!(名称空间)
)2 DTD
导入DTD的方式
- 内部导入
<!ELEMENT note (to,from,heading,body)>
<!ELEMENT to (#PCDATA)>
<!ELEMENT from (#PCDATA)>
<!ELEMENT heading (#PCDATA)>
<!ELEMENT body (#PCDATA)>
]>
- 外部导入
本地文件系统:
<!DOCTYPE note SYSTEM "note.dtd">
- 公共的外部导入:
<!DOCTYPE 根元素 PUBLIC "http://gz.itcast.cn/itcast.dtd">
DTD语法
约束标签:
<!ELEMENT 元素名称 类别 或 <!ELEMENT 元素名称 (元素内容)>
-
类别:
-
空标签: EMPTY。 表示元素一定是空元素。
-
普通字符串: (#PCDATA)。表示元素的内容一定是普通字符串(不能含有子标签)。
-
任何内容: ANY。表示元素的内容可以是任意内容(包括子标签)
-
(元素内容)顺序问题:
<!ELEMENT 元素名称 (子元素名称 1,子元素名称 2,.....)>: 按顺序出现子标签
-
次数问题:
标签 | 次数 |
---|---|
必须且只出现1次 | |
+ | 至少出现1次 |
* | 0或n次 |
? | 0 或1次 |
约束属性:
<!ATTLIST 元素名称 属性名称 属性类型 默认值>
-
默认值:
-
#REQUIRED 属性值是必需的
-
#IMPLIED 属性不是必需的
-
#FIXED value 属性不是必须的,但属性值是固定的
-
属性类型:
属性类型 | 表示 |
---|---|
CDATA | 表示普通字符串 |
(en1|en2|..) | 表示一定是任选其中的一个值 |
ID | 表示在一个xml文档中该属性值必须唯一,值不能以数字开头 |
)3 Schema
名称空间:
告诉xml文档的哪个元素被哪个schema文档约束。 在一个xml文档中,不同的标签可以受到不同的schema文档的约束。
- 一个名称空间受到schema文档约束的情况
- 多个名称空间受到多个schema文档约束的情况
- 默认名称空间的情况
- 没有名称空间的情况
By : vpt
Ps : 此文基于黑马培训笔记,用于之后回顾知识点以markdown形式整理而成。
网友评论