设为首页  
联系我们  
加入收藏  
网页制作 冲浪宝典 图形图像 操作系统 软件教学 编程开发 认证考试 安全技术 站长专区 文学驿站 娱乐天地 游戏天地 办公软件
文章搜索
您的位置: 首页 >> 文章首页 >> 编程开发 >> 网络编程 >> .net >> 关于JAXP,DOM,SAX,JDOM,DOM4J的一些想法
精品推荐
.net点击TOP10
·我的.NET书架 (入门篇)
·.NET:是什么?将走向哪里?
·.NET 初 级 读 本
·在ASP.NET中把图片保存到SQL SERVER数据库
·从零开始学ASP.NET(基础篇)
·DataGrid导成Excel的例子
·ASP.Net Web Page深入探讨(一)
·.NET Petshop详解(三):petshop三层结构之MiddleTire
·CHK文件恢复工具
·快速认识asp.net(一)
网络编程点击TOP10
·ASP.NET 程序中常用的三十三种代码
·利用ASP.NET构建网上考试系统
·C#版的网站新闻发布系统
·设计ASP.NET新闻管理系统
·我的.NET书架 (入门篇)
·用ASP.NET和XML做的新闻系统
·.NET:是什么?将走向哪里?
·.NET 初 级 读 本
·十天学会ASP.net之第一天
·用C#实现木马程序
精选专题

关于JAXP,DOM,SAX,JDOM,DOM4J的一些想法

作者: 来源:网络文章 时间:2005-12-13 19:24:49

关于JAXP,DOM,SAX,JDOM,DOM4J的一些想法(1)

关于JAXPDOMSAXJDOMDOM4J的一些想法

 

这些APIXSLT的关键部分,它们构建在DOMSAX解析器基础上。

SunXML领域总是后知后觉,等到Sun重视XML的时候,XMLAPI早就满天 飞了,尤其是IBM具有非常大的领先优势。不过Sun是规范的制订者,于是参考WXML:namespace prefix = st1 ns = "urn:schemas-microsoft-com:office:smarttags" />CSC="0" NumberType="1" Negative="False" HasSpace="False" SourceValue="3" UnitName="C">3C的标准制订了JAXP规范。JAXP不像XercesCrimon那样,它只是一个spec,本身是不做任何事情的,它的作用就是提出一个统一的接口,让其它的XML API都来遵循JAXP编程,那么用JAXP写出来的程序,底层的API可以任意切换。

具体来说JAXP包括了几个工厂类,这就是JDK1.4里面的Javax.XML.parsers 包,用来寻找符合DOM标准的XML API实现类的位置;此外JAXP还包括一整套interface,这就是JDK1.4里面的org.wCSC="0" NumberType="1" Negative="False" HasSpace="False" SourceValue="3" UnitName="C">3c.dom那几个包。工厂类负责加载DOM的实现类。

当你严格采用JAXP编程的时候,是遵循WCSC="0" NumberType="1" Negative="False" HasSpace="False" SourceValue="3" UnitName="C">3CDOm标准的,那么在JAXP底层你实际上可以任意切换不同的DOM实现,例如Xerces,或者Crimon,再或者其它,切换方法就是配置jaXP.properties。因此JAXP就是一些标准接口而已。

XML:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" /> 
JAXP应用程序 -> JAXP接口 -> Xerces DOM实现 -> Xerces DOM/SAX 解析器
JAXP应用程序 -> JAXP接口 -> Crimson DOM实现 -> Crimson DOM/SAX 解析器
JAXP应用程序 -> JAXP接口 -> Crimson DOM实现 -> Xerces DOM/SAX 解析器

 

WCSC="0" NumberType="1" Negative="False" HasSpace="False" SourceValue="3" UnitName="C">3CDOM标准API难用的让人想撞墙,于是有一帮人开发Java专用的XML API目的是为了便于使用,这就是jdom的由来,开发到一半的时候,另一部分人又分了出来,他们有自己的想法,于是他们就去开发dom4j,形成了今天这样两个API,至于他们之间的性能,功能之比较看看上面我推荐的文章就知道了,jdom全面惨败。

jdom 相当于上面的 JAXP接口 Xerces DOM实现部分,它本身没有解析器,它可以使用Xerces或者Crimson的解析器

 

jdom应用程序 -> jdom API -> Xerces/Crimson解析器
dom4j应用程序 -> dom4j API -> Xerces/Crimson解析器
dom4j应用程序 -> dom4j API -> Alfred2解析器

 

因此可以看出采用dom4j/jdom编写的应用程序,已经不具备可移植性了。

SunJAXP标准的制订者,甚至很执著的在JDK1.4里面绑定Crimson DOM实现和解析器,然后可笑的是,Sun自己的JAXM RI竟然不是用JAXP写出来的,而是dom4j

 

我的举例:

1.  仅仅是XSL转换。XMLàHTML,通过XSL

Import Javax.XML.transform.TransformerFactory;

Import Javax.XML.transform.Transformer;

Import Javax.XML.stream.StreamSource;

Import Javax.XML.stream.StreamResult;

import Java.io.FileOutputStream;

TransformerFactory transFactory = TransformerFactory.newInstance();

Transform transformer = transFacyory.newTransformer(new StreamSource(XMLSheetName));

Transformer.transform(new StreamSource(XMLFileName),new StreamResult(new FileOutputStream(outputURL)));

这里的stream是一个DOM对象。
我感觉这个就是JAXP应用程序 -> JAXP接口 -> Xerces DOM实现 -> Xerces DOM/SAX 解析器,不知道对不对。
 
2.遍历XML,通过DOM。不仅仅是XSL转换。中间有对XML元素内容的操作。

Import Javax.XML.transform.TransformerFactory;

Import Javax.XML.transform.Transformer;

Import Javax.XML.stream.StreamSource;

Import Javax.XML.stream.StreamResult;

import Java.io.FileOutputStream;

//Xerces解析器来完成DOM遍历XML.DOMParserXerces包的一部分。

Import org.apache.xerces.parsers.DOMParser;

Import org.wCSC="0" NumberType="1" Negative="False" HasSpace="False" SourceValue="3" UnitName="C">3c.dom.Document;

Import org.wCSC="0" NumberType="1" Negative="False" HasSpace="False" SourceValue="3" UnitName="C">3c.dom.NodeList;

 

//DOM遍历XML

DOMParser parser = new DOMParser();

Parser.parse(XMLFileName);//解析并在内存中创建XML树。

Document document = parser.getDocument();//通过Document对象,可以使用内存中的树。

NodeList prodUCts = document.getElementByTagName(“prodUCt_id”);

Int num_prodUCts = prodUCts.getLength();

 

//XSL转化器

TransformerFactory transFactory = TransformerFactory.newInstance();

Transform transformer = transFacyory.newTransformer(new StreamSource(XMLSheetName));

Transformer.transform(new StreamSource(XMLFileName),new StreamResult(new FileOutputStream(outputURL)));

 

我感觉XSL转化和对XML对象的操作是两个过程。可以分别对待。最重要的是对对象的操作。这也就是为什么有DOM,JDOM,DOM4J。转化好像只需要JAXP就可以了,关心的是StreamSourceStreamResult。这两个是DOM对象。

 
3.JDOM使用,生成Document内容并保存到XML文件。
import org.jdom.Element;

import org.jdom.Document;//Import org.wCSC="0" NumberType="1" Negative="False" HasSpace="False" SourceValue="3" UnitName="C">3c.dom.Document对比一下。一个是JAXP的一个是JDOMDocument

import org.jdom.output.XMLOutputter;
 

Element root = Element(“orders”);

root.addContent(“ ”);

org.jdom.Document document = new Document(root);//创建JDOM树。

 

FileOutputStream outStream = new FileOutputStream(XMLFileName);

XMLOutputter outToFile = new XMLOutputter();

outToFile.output(document,outStream);

outStream.flush();

outStream.close();

 

jdom应用程序 -> jdom API -> Xerces/Crimson解析器
VS
JAXP应用程序 -> JAXP接口 -> Xerces DOM实现 -> Xerces DOM/SAX 解析器
 

这里的没有Transform的过程,直接把Document的内容存到XML中。没有XSL转化,没有XSL文件。

JDOM提供了几种输出方法。这里XMLOutputter是保存到文件,输出一个实际的XML流。还有DOMOutputter,在内存中创建一个传统的DOM树。还有SAXOutputter,创建一串SAX事件以便被其他对象读取。

 
 
4.JDOM使用,读取已有的XML然后生成Document,修改Document
import org.jdom.Element;

import org.jdom.Document;

import org.jdom.output.XMLOutputter;
   import org.jdom.input.SAXBuilder;
 
   SAXBuilder builder = new SAXBuilder();
   Document document = builder.build(XMLFileName);
 

Element order = Element(“orders”);

orders.addAttribute(“order_id”,session_id);

Element root = document.getRootElement();//root是已经存在的根元素。

Root.addContent(order);//在根元素里增加orders元素。

 

//document保存到文件中。

FileOutputStream outStream = new FileOutputStream(XMLFileName);

XMLOutputter outToFile = new XMLOutputter();

outToFile.output(document,outStream);

outStream.flush();

outStream.close();

 

 

即使创建一个DOM式的结构,这里仍使用SAXBuilder来做这这件事情。

DOMBuilderSAXBuilder中的”DOM””SAX”指的是用于建立文档的方法,而不是生成的内容。

 
 
5.XSL转换,能把DOM对象转化成输出,也可以向上面所举例的把XMLFileName的流转化成输出的流(文件或屏幕显示)。但是不能把JDOM对象转化,所以需要把JDOM转化成DOM对象,然后再输出。
import org.jdom.Element;

import org.jdom.Document;

import org.jdom.output.XMLOutputter;
   import org.jdom.input.SAXBuilder;   
   //XSL转化需要的包
 import org.jdom.output.DOMOutputter;//对比org.jdom.output.XMLOutputter;

 Import Javax.XML.transform.TransformerFactory;

Import Javax.XML.transform.Transformer;

Import Javax.XML.transform.DOMSource;//对比Import Javax.XML.stream.StreamSource;

Import Javax.XML.stream.StreamResult;

  
  org.wCSC="0" NumberType="1" Negative="False" HasSpace="False" SourceValue="3" UnitName="C">3c.dom.Document DOMDoc;
  DOMOutputter DomOut = DOMOutputter();
  DOMDoc = DomOut.output(org.jdom.Document);//jdomdocument转化成DOMdocument
  
  TransformFactory transFactory = TransformFactory.newInstance();
  Transformer transformer = transFactory.newTransformer(new DOMSource(DOMDoc));//感觉错了,应该是XSL文件。
  Transformer.transform(new DOMSource(DOMDoc),new StreamResult(out));
 
 //对比以前的转化,是从文件到文件,现在是DOM树到屏幕输出。

TransformerFactory transFactory = TransformerFactory.newInstance();

Transform transformer = transFacyory.newTransformer(new StreamSource(XMLSheetName));

Transformer.transform(new StreamSource(XMLFileName),new StreamResult(new FileOutputStream(outputURL)));

共2页 9 7 [1] [28 :>

关于JAXP,DOM,SAX,JDOM,DOM4J的一些想法 相关文章:
关于JAXP,DOM,SAX,JDOM,DOM4J的一些想法 相关软件:
特别声明:本站除部分特别声明禁止转载的专稿外的其他文章可以自由转载,但请务必注明出处和原始作者。文章版权归文章原始作者所有。对于被本站转载文章的个人和网站,我们表示深深的谢意。如果本站转载的文章有版权问题请联系编辑人员,我们尽快予以更正。
转载请注明来源:http://www.xgdown.com