注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

FlyingWind

 
 
 

日志

 
 
 
 

JDK6的新特性(三)理解StAX   

2008-08-10 14:39:52|  分类: JAVA资料 |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |
;{O9R:!
l,9fT}n) JDK6的新特性之三:理解StAX  
F$%bZR>Nh StAX(JSR 173)是JDK6.0中除了DOM和SAX之外的又一种处理XML文档的API 
*gNO6?  
eq4f6Hge StAX的来历  
@TGT\p5- K  
I&ZMrDlkg> 在JAXP1.3(JSR 206)有两种处理XML文档的方法:DOM(Document Object Model)和SAX(Simple API for XML).由于JDK6.0中的JAXB2(JSR 222)和JAX-WS 2.0(JSR 224)都会用到StAX所以Sun决定把StAX加入到JAXP家族当中来,并将JAXP的版本升级到1.4(JAXP1.4是JAXP1.3的维护版 本). JDK6里面JAXP的版本就是1.4. 
HX3Q@.?y;  
&!>s30d? StAX简介 
2,L8l`  
StAX 是The Streaming API for XML的缩写,一种利用拉模式解析(pull-parsing)XML文档的API.StAX通过提供一种基于事件迭代器(Iterator)的API让 程序员去控制xml文档解析过程,程序遍历这个事件迭代器去处理每一个解析事件,解析事件可以看做是程序拉出来的,也就是程序促使解析器产生一个解析事件 然后处理该事件,之后又促使解析器产生下一个解析事件,如此循环直到碰到文档结束符;SAX也是基于事件处理xml文档,但却是用推模式解析,解析器解析 完整个xml文档后,才产生解析事件,然后推给程序去处理这些事件;DOM采用的方式是将整个xml文档映射到一颗内存树,这样就可以很容易地得到父节点 和子结点以及兄弟节点的数据,但如果文档很大,将会严重影响性能。下面是这几种API的比较(转载自http://www.blogjava.net/hsith/archive/2006/06/29/55817.html 5?~o2wa
rw2 ,MK/f?  
\D8T93>o XML Parser API Feature Summary Feature StAX SAX DOM TrAX  
f> +=Ar:d API Type Pull, streaming Push, streaming In memory tree XSLT Rule  
yqF^[D^ Ease of Use High Medium High Medium  
0D<\ yG9 XPath Capability No No Yes Yes  
tJCQ "?S} CPU and Memory Efficiency Good Good Varies Varies  
:? 70w5- Forward Only Yes Yes No No  
8oy5mJd\o Read XML Yes Yes Yes Yes  
V%<Uc}?4! Write XML Yes No Yes Yes  
D iAO Create, Read, Update, Delete No No Yes No  
24RkxU|EW  
W5if(fQ-YW  
m!]%4Z- StAX代码演示 
c_Rg*1xk  
B5#J&(B;Z 下面代码演示了如何通过StAX读取xml文档和生成xml文档 
$uEWk ?  
e9 tL@ public class StaxTester { 
4G {Ljd`G   public static void main(String[] args) throws XMLStreamException, FileNotFoundException { 
^-?]W*dkN@     readXMLByStAX();//用XMLEventReader解析xml文档 
5Yk&DvI*E     writeXMLByStAX();//用XMLStreamWriter写xml文档 
33Ip]?\Q=   } 
X?.Ptq 0  
DYOIexA_K#   private static void readXMLByStAX() throws XMLStreamException, FileNotFoundException { 
T\F4\0%     XMLInputFactory xmlif = XMLInputFactory.newInstance(); 
y8EBy.p)k     XMLEventReader xmler = xmlif.createXMLEventReader(StaxTester.class.getResourceAsStream("test.xml")); 
#Q$|n=>p<     XMLEvent event; 
g]6ib772     StringBuffer parsingResult = new StringBuffer(); 
zRU}=qb     while (xmler.hasNext()) { 
Wh%`''         event = xmler.nextEvent();          
iLoHI         if (event.isStartElement()) { //如果解析的是起始标记 
Cm U94Cv0           StartElement se = event.asStartElement(); 
-fQ"Nf1*           parsingResult.append("<"); 
c@At0od|           parsingResult.append(se.getName()); 
zCaf4b1           if(se.getName().getLocalPart().equals("catalog")) { 
Vc'VV2PnS             parsingResult.append(" id=\""); 
$T ^UV             parsingResult.append(se.getAttributeByName(new QName("id")).getValue()); 
V@zTlO(4"             parsingResult.append("\"");  
d6SX\)t           } 
Qat6)0TCe           parsingResult.append(">"); 
n:? c{ZZ         } else if (event.isCharacters()) { //如果解析的是文本内容 
BX$-H]           parsingResult.append(event.asCharacters().getData()); 
;WAP@^          } else if(event.isEndElement()){ //如果解析的是结束标记 
/D>0-hyv4&           parsingResult.append("</"); 
onzx%3)           parsingResult.append(event.asEndElement().getName()); 
(PTqz0ds5           parsingResult.append(">"); 
CdK<o9R         } 
=n^     } 
LI JX|0i     System.out.println(parsingResult); 
EvCs*VS $   } 
hIA?K%G  
E$qTaxLe   private static void writeXMLByStAX() throws XMLStreamException, FileNotFoundException { 
~zMX1K0*     XMLOutputFactory xmlof = XMLOutputFactory.newInstance(); 
KG$oUcfSU     XMLStreamWriter xmlw = xmlof.createXMLStreamWriter(new FileOutputStream("output.xml")); 
Po\|'*n@  
:c dS+V     // 写入默认的 XML 声明到xml文档 
wmk"|\O]     xmlw.writeStartDocument(); 
.W VOLwU%     xmlw.writeCharacters("\n"); 
G3.S:XL`y     // 写入注释到xml文档 
:+n nc a     xmlw.writeComment("testing comment"); 
BLvm0zC8}     xmlw.writeCharacters("\n"); 
Qa*0.E     // 写入一个catalogs根元素 
%~fM"#     xmlw.writeStartElement("catalogs"); 
    xmlw.writeNamespace("myNS", "http://blog.csdn.net/Chinajash 3a <ZO' "); 
J[  I'I7     xmlw.writeAttribute("owner","Chinajash"); 
FWB]C*u     xmlw.writeCharacters("\n"); 
zMx]g     // 写入子元素catalog 
    xmlw.writeStartElement("http://blog.csdn.net/Chinajash Ep(oN4 ", "catalog"); 
ysks EVc     xmlw.writeAttribute("id","007"); 
( V#dqbtV     xmlw.writeCharacters("Apparel"); 
i7(3x L     // 写入catalog元素的结束标签 
{ =w -3A     xmlw.writeEndElement(); 
&tx>o,     // 写入catalogs元素的结束标签 
`\_F':)!;     xmlw.writeEndElement(); 
:y_jKZ|     // 结束 XML 文档 
E{mlN]     xmlw.writeEndDocument();      
_l)( [g     xmlw.close(); 
8oZVx   } 
S!AR\H`0
yrY?)hQ  
J'rs~Z&B test.xml文件内容如下: 
#A)ih6%  
,M)'@3X" <?xml version="1.0" encoding="UTF-8"?> 
\ .VN3U3S <catalogs> 
`R)?]k5!{H   <catalog id="001">Book</catalog> 
qD_AIP=   <catalog id="002">Video</catalog> 
!.=E?Tp </catalogs> 
hCYD?|>  
_cj@If 运行上面程序后,控制台输出如下: 
!_/ \F9 !Q  
5W*M*Z w/ <catalogs> 
.Ho&epZJ`   <catalog id="001">Book</catalog> 
Fd"^Sn<Hc   <catalog id="002">Video</catalog> 
Ge97RIfz2 </catalogs> 
bXYc(l;  
Re&;NO 运行上面程序后,产生的output.xml文件如下: 
+g ?<*o"P  
*(AX+s9oK <?xml version="1.0" ?> 
clEoQnb <!-- testing comment--> 
<catalogs xmlns:myNS="http://blog.csdn.net/Chinajash (FLCPBQ: " owner="Chinajash"> 
q{"$l   <myNS:catalog id="007">Apparel</myNS:catalog> 
</catalogs>
  评论这张
 
阅读(323)| 评论(0)
推荐 转载

历史上的今天

在LOFTER的更多文章

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017