javaweb2

JDK6.0 之前 XML 解析方式 两种:DOM 解析 、SAX解析
1、DOM (Document Object Model 文档对象模型) ,是W3C 推荐一种解析方式
思想:将整个XML 读取到内存中,在内存中形成树形结构(文档对象模型),通过API对内存中树形结构进行操作


2、SAX (Simple API for XML) 不是官方标准,是程序自己发明一种解析方式
为什么要有SAX? DOM解析时,如果XML文档非常巨大,将文档整个加载到内存,非常占用系统资源 ---- 如果文件特别大,根本无法加载到内存(内存溢出)
程序员推出一种一边读取XML 一边进行解析 技术 ---- SAX
思想:采用一边读取,一边解析过程,当数据被解析操作后,内存资源会很快得到释放,即使XML非常巨大,也可以完成解析


JDK6 推出第三种XML解析方式 STAX 通过流方式解析XML ,原理和SAX类似
3、STAX :STAX和SAX 都是一边读取一边解析,区别SAX 采用push解析模式,。STAX采用pull 解析模式 ---- STAX效率高于SAX ???


程序员进行XML开发,根据思想 ,使用API 完成编程 ----- Jaxp(sun)、xml pull 、dom4j
JAXP(sun) 官方API 从JDK6.0 开始同时支持 DOM、SAX、STAX三种解析方式
XML PULL 开源框架,采用STAX解析方式,Android系统内部 内置XML PULL ----- Android开发工程师首选
DOM4J 开源框架,采用DOM解析方式,API非常方便 ----- JavaEE工程师进行XML解析首选


DOM、SAX、STAX 解析方式 --- 解析XML思想
JAXP、XML PULL、DOM4J 开发API ---- 直接使用来编程 ---- 是上面三种解析方式思想API实现


DOM :大文件不能用,内存加载整个文档 ----- 可以修改数据
SAX/STAX: 可以一边读取,一边解析、一边释放资源 ----- 将读取数据进行释放,不可以修改数据
***** SAX/STAX 读取XML 数据不释放 --- 结果就和DOM 一样


------------------------------------------------------------------------------------------------
JAXP : sun提供API、从6.0开始支持DOM、SAX、STAX
javax.xml ----- XML 核心解析包(通用类)
org.w3c.dom ----- DOM解析核心包(官方)
org.xml.sax ----- SAX解析核心包(社区)
javax.xml.stream ---- STAX 解析核心包


XML 主要用途: 存储和传输数据 ---- 企业主流应用 
1、配置文件 (格式非常严格) ---- 一般采用约束DTD、Schema
2、数据文件(存储、传输) ---- 都是由程序生成,由程序解析,为了方便(很多开发不添加约束)


// 步骤一 javax.xml.parsers 解析工厂和解析器 读取xml
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();// 创建工厂对象
DocumentBuilder builder = factory.newDocumentBuilder();
// 步骤二 使用解析器读取xml文件 --- DOM思想 加载整个文档形成内存文档对象
Document document = builder.parse("product.xml");// 默认读取工程根目录


获得Document (文档对象) ,Document指向文档树形结构 根节点 ---- 通过Document的getElementsByTagName 获得节点列表


在XML文档中,形成树形结构 --- 所有元素、属性、文本 都成为节点
节点 Node 
属性节点 Attr
元素节点 Element
文本节点 Text 
注释节点 Comment
CDATA块节点 CDATASection
文档节点 Document
* 所有节点 都是Node 接口子接口 


Node通用API
getNodeName():返回节点的名称
getNodeType():返回节点的类型
getNodeValue():返回节点的值


// 步骤三 通过document的getElementsByTagName 获得元素节点列表
NodeList nodeList = document.getElementsByTagName("product");


// 步骤四 遍历节点列表
for(int i=0;i < nodeList.getLength(); i++){
   // 步骤五 因为获得元素节点列表,通过强制类型转换,将node转换Element
   Element element = (Element)nodeList.item(i);
}


// 步骤六 在获得Element后,通过element的getAttribute 获得属性 ,可以通过element的 getTextContent 获得文本内容 
element.getTextContent() ===== element.getFirstChild().getNodeValue();


强化 DOM 增删改查操作
1、 强化查询
第一步:通过全局查找 快速缩小节点数据范围 
getElementsByTagName 通过元素名称 获得元素节点列表
getElementById 根据ID属性查找 ***** 属性 必须ID类型(来自约束) ------ 使用方法 必须XML 有约束
* DTD API默认支持的,添加DTD就可以使用getElementById 、Schema 必须编程加载 ,才能有效


第二步:根据节点相对位置 获得要查找数据
parent 父节点 children 子节点 sibling兄弟
 
        <product id="p02">
<name>手机</name>
<price>3000</price>
<number>20</number>
<description>21世纪 通讯主要手段</description>
</product>


product 节点有9个子节点,5个回车换行、4个元素 ===== price 是第四个儿子


2、完成 增加、修改、删除节点操作 DOM在内存中形成树形结构,操作内存中树
回写XML: javax.xml.transform包中的Transformer


增加节点:1) 创建要加入节点,封装数据 2) 找到插入位置父节点 3) 父节点.appendChild 完成插入


修改节点:1) 先查询目标节点 2) 改文本内容 setTextContent 、改属性 setAttribute(name,value)


删除节点:1) 找到删除节点 O  2) o.getParentNode().removeChild(o);// 用父亲杀死自己
 
----------------------------------------------------------------------------------------------
JAXP SAX 解析 : 一边读取、一边解析,不需要将整个xml 保存内存中
SAX 是事件驱动的 XML 处理方法
存在很多事件:


startDocument()  文档开始事件
startElement(String uri, String localName, String qName, Attributes attributes)  元素开始事件
characters(char[] ch, int start, int length)  文本节点事件
endElement(String uri, String localName, String qName)  元素结束事件
endDocument()  文档结束事件


哪个元素开始了 startElement qName
哪个元素结束了 endElement qName
属性值 startElement  attributes.getValue(属性名)
文本内容 characters 


-----------------------------------------------------------------------------------------------
DOM 解析模式:将整个XML 加载内存中,形成文档对象模型,通过API操作文档树,回写数据
SAX 解析模式,一边读取文档,一边解析数据,同时传递文档和handler 给解析器,解析器会自动调用文档中相应事件的方法 
** 由解析器控制完成,自动回调传递handler中实现方法
STAX : The Stream  API for XML
XML PULL 是 STAX 实现 开源框架,如果 JavaEE 开发必须下载 PULL 的jar包,如果Android 开发,无需下载任何开发包


http://www.xmlpull.org 提供XML PULL API 只有接口,没有实现类, 
* Android 系统内部 内置 实现 XPP3 (Xml Pull Parser 3rd Edition)


什么是jar 包: .class文件压缩包,很多开源框架或者组件,都提供jar包下载,只要将jar包复制当前工程classpath ,使用这些.class文件


1、 下载xpp3.zip 包,解压缩
2、 将其中jar复制到当前工程classpath , 新建lib目录 , 将jar包复制当前工程lib下,右键点击jar包 build path --- add to build path 


PULL 解析器事件:
START DOCUMENT  文档开始事件
START_TAG 元素开始事件
TEXT 文本节点事件
END_TAG 元素结束事件
END_DOCUMENT 文档结束事件


PULL 解析器使用pull 解析模式,和上午SAX中push 解析模式区分开
SAX(push):将文档和handler 一起传递解析器,解析器自动解析,调用handler中相应事件方法 ----- 解析过程由解析器自动控制完成
STAX(pull):将文档传递解析器,解析器不会自动解析,需要调用next方法驱动解析器完成解析,在解析过程中,通过getEventType 获得当前节点解析事件类型,从而编写不同代码逻辑。 -------- 解析过程有程序员客户端程序来控制


*** 在pull 解析过程中,程序员可以根据需要,实现相应事件代码,不需要事件,可以不用实现 ---- 比SAX 效率更高


parser.getName() 获得当前元素名称
parser.nextText() 获得下一个文本元素值
parser.getAttributeValue 获得属性的值


******* 实际开发中 :PULL 用法和DOM 类似 
将整个文档内容 都读取到内存中,在内存中保存所有数据,对数据可以进行增删改查


-----------------------------------------------------------------------------------------------------


使用pull 解析器,将内存中数据 序列化为一个XML 文件 ---------- XmlSerializer 


<?xml version="1.0" encoding="UTF-8"?>
<teacher><name>老王</name><company>传智播客</company></teacher>


                XmlPullParserFactory factory = XmlPullParserFactory.newInstance();
XmlSerializer serializer = factory.newSerializer();


serializer.setOutput(new FileOutputStream("teacher.xml"), "utf-8");


serializer.startDocument("utf-8", true);
serializer.startTag(null, "teachers");
for (Teacher t : teachers) {
serializer.startTag(null, "teacher");
serializer.startTag(null, "name");
serializer.text(t.getName());
serializer.endTag(null, "name");
serializer.startTag(null, "company");
serializer.text(t.getCompany());
serializer.endTag(null, "company");
serializer.endTag(null, "teacher");
}
serializer.endTag(null, "teachers");
serializer.endDocument();


将List java对象 写入XML中 


增删改查 代码 --- 将 XML转List 和 List序列化XML 代码抽取 工具类方法
foreach 循环删除数据 java.util.ConcurrentModificationException (后天详讲)


--------------------------------------------------------------------------------------------------------------
总结:
1、 XML 解析方式 有几种 : DOM 、SAX、STAX
2、 DOM和SAX、STAX 解析思想
3、 PUSH 和 PULL 区别
4、 JAXP DOM ---- W3C 官方推荐标准,所有技术都支持
全局查找 getElementsByTagName --- 返回NodeList --- 掌握 NodeList 遍历
相对位置关系查找 父节点、子节点集合、兄弟节点


获得Element ----- getAttribute 、getTextContent


DOM 添加: 创建节点 document.createElement("xxx")、添加节点 父节点.appendChild 
DOM 修改: setTextContent setAttribute
DOM 删除: o.getParentNode().removeChild(o);


*** DOM 必须会增删改查


5、SAX 主要掌握其原理,编程不要求掌握
6、XML PULL 最重要 XML2List  List2XML ----- 完成增删改查


*** 使用pull 完成XML 增删改查


商品xml 练习 !!!!!











































































































































































  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值