xml 解析 DOM 和 SAX
xml 解析技术 一直 更新
DOM 思想:xml 对象
问题:文档越来越大 ---> 性能
SAX 思想:(Simple API for XML)不是官方标准,但它是XML社区事实上的标准,几乎所有的XML解析器都支持它。
只去寻找需要的数据,不去分析不需要的
JAXP(Java API for XML Processing ) 官方的--- sun JDK支持
JAXP支持DOM 和SAX
Jdom、dom4j 民间 ---> 使用DOM思想来处理XML
企业程序员 JDOM 写到一半的时候 其中一部分人 DOM4J
DOM 思想(Document Object Model,即文档对象模型)W3C组织推荐的解析XML的一种方式。
元素与元素之间 父子关系
<books>
<book>
<id>b01</id>
<name>think in java</name>
</book>
<book>
<name>core java</name>
</book>
<book>
<name>java 入门</name>
</book>
</books>
SAX 解析 逐行读取分析
需要core java
先读取 think in java 不需要
读取到 core java
xml语法 : 元素 属性 注释
node 节点 包括:元素 属性 文本
以book为例
books 位于 book之上
book位于 name之上
节点只能有一个父节点(parent)
节点可以有多个子节点(children)
学习DOM解析 ----> 第一步:获得整个文档对象 Document
getDocumentElement()
这是一种便捷属性,该属性允许直接访问文档的文档元素的子节点。
Element getElementById(String elementId)
返回具有带给定值的 ID 属性的 Element。
NodeList getElementsByTagName(String tagname)
按文档顺序返回包含在文档中且具有给定标记名称的所有 Element 的 NodeList。
Node 子节点 :Attr、Element
NodeList 节点列表 : 多个节点
[#document: null]
[books: null]
-------------
[book: null]
-------------
[book: null]
-------------
[book: null]
getTextContent
当你使用sysout输出一个复杂元素 [元素名: null]
当你使用getTextContent 输出复杂元素内容时:所有子元素的内容 不包含标签 // 不使用
当你使用getTextContent 输出简单元素内容时:直接得到里面文本内容
DOM 查找元素 :
1、全局查找 getELementsByTagName
2、相对位置关系查找 父节点 子节点 兄弟节点
Attr节点 ---- > document.getElementById()
getNodeName():返回节点的名称(元素-- > 标签名 属性---> 属性名称 文本--->#text)
getNodeType():返回节点的类型 (Node源码 1 元素 2属性 3文本)
getNodeValue():返回节点的值 ---> 1、元素null 2.属性 属性值 3.文本 文本内容
getTextContent() 1.元素 返回所有后代节点文本内容 2.属性 属性值 3. 文本 文本内容
XML 空格和回车 保留
<xxx></xxx> 子节点为0
<xxx>
</xxx> 子节点 1个 类型:文本
<xxx>
<yyy></yyy>
</xxx> 子节点 3个 第一个回车:文本节点 <yyy>:元素节点 第二个回车:文本节点
<xxx>
yyy
</xxx> 子节点 1个 回车yyy回车:文本节点
<a>
<a1><text></text></a1>
<a2></a2>
<a>
删除节点 A
A的父节点调用removeChild(A)
思考:
增加节点,增加了一个已经存在的节点?? ----> 节点移动
练习:实现节点互换?
SAX Parser 加载XML
XML解析绑定到 ----- DocumentHandler
SAX
元素开始 <book id="itcast101"> 元素名称 属性列表
startElement(String uri, String localName, String qName,
Attributes attributes)
qName 元素名称
attributes 属性列表
characters(char[] ch, int start, int length) ---- new String(ch,start,length)
元素结束 </book> 元素名称
SAX解析时 怎么样在找到需要的数据后 中止? throw new SAXException()
SAX解析
1、解析开始元素 解析属性
2、解析结束元素 解析结束元素里面的文本内容
Xpath 是 W3C xml 查找技术
DOM4j 如何实现Xpath
Xpath表达式
/books/book 所有直接位于books子元素的book元素
//book 匹配所有book元素 不管元素在哪个位置
/books//book 匹配所有books 后代book元素
//@id 匹配所有id属性对象
//book[@id] 匹配所有包含id属性的book元素,无论位置在哪
//book[@id='itcast101'] 匹配id属性为itcast101的book元素
//book[name='think in java'] 匹配所有name为think in java的book元素
//student[age>20] 匹配所有age大于20的student元素
//* 匹配所有元素
//*[@id] 匹配所有含有id属性的元素
商品信息管理系统案例
商品信息(商品编号,商品名称,描述,价格,数量)
控制台 UI
1、选择功能
CURD
2、C 新建一个商品
从控制台输入商品5个信息
输入后,将信息写入一个xml文件
3、查询 输入条件