??xml version="1.0" encoding="utf-8" standalone="yes"?>欧美性xxxxx,午夜久久av,新版中文字幕在线资源http://www.aygfsteel.com/TonyZhangtl/archive/2009/12/09/305326.htmlTonyZhangtlTonyZhangtlWed, 09 Dec 2009 12:27:00 GMThttp://www.aygfsteel.com/TonyZhangtl/archive/2009/12/09/305326.htmlhttp://www.aygfsteel.com/TonyZhangtl/comments/305326.htmlhttp://www.aygfsteel.com/TonyZhangtl/archive/2009/12/09/305326.html#Feedback0http://www.aygfsteel.com/TonyZhangtl/comments/commentRss/305326.htmlhttp://www.aygfsteel.com/TonyZhangtl/services/trackbacks/305326.html

character set,character encoding和xml encoding declaration

hanlray@gmail.com

Revision: 0.9 Date: 2005/08/28


1. character set和character encoding

一 直以为character set和character encoding是一回事Q最q才发现它们差不多是两个概念。从字面意思上看,一个character set是一些字W的集合Q比?6个英文字母,全体汉字Q或者两者的l合Q然而计机是只能处理数字的Q一个字W必被表示成一个数字才可能被计机? 理,因此一个character setq必d义字W到数字的映关p,比如字符A映射到数?4Q字WZ映射到数?0Q这些数字叫做code pointsQcharacter encoding则用来定义这些code points如何用字节表C出来,比如code point 90可以被编码ؓ一个单字节Q一个little-endian的unsigned shortQ一个big-endian的integerQ或者更复杂的Ş式。换句话_一个character set仅仅是一张字W和数字的映表Q它q不规定q些数字如何用字节表C出来,q种表示的事情由character encoding来定义。因此,一个character encoding是针对一个character set的,而一个character set可以有多个character encodingQ比如UTF-8QUTF-16都是Unicode Character Set的encoding?/p>

2. xml encoding declaration

? 一D늼码后的文本,要想正确地处理它Q必要事先知道光用的~码方式Q因此这U编码信息一般是存在于该文本之外的,比如某些~辑器会在文件开始放几个? 可见的字节来指示其正文的~码方式Q这些字节叫做BOMQByte Order MarkQ;某些|络协议会有一些字D|指示其所携带文本的编码方式。这U方式很直观Q很多系l?技术采用这U方式,大多数有关xml的应用也会优先? q种外部的编码信息,但是当没有这U外部的~码信息可用的时候呢Q一个xml document可以用一个xml declaration来声明其采用的编码,形如<?xml version="1.0" encoding="UTF-8"?>Q这U方式看h不大可能工作Q因个声明本w就是文本的Qƈ且该声明是xml document的一部分Q不可能规定光用的~码方式。如何能在不知道xml document~码的情况下理解其xml declaration中声明的~码呢?对xml~码声明的位|及内容的限制自动成为可能:~码声明必须出现在文档开_只允许ASCII字符q且 其头几个字符必须?lt;?xmlQ这P一个xml processor可以先d文档的前几个字节Q推断其采用的编码的特征Q根据该特征能理解xml declarationQ读出encoding属性|从而知道该文档的编码。比如,如果?个字节的内容?C 3F 78 6DQ则可以定该文档采用的是一U兼容ASCII的编码,q样xml processor可以用MU兼容ASCII的编码(如UTF-8Q来理解~码后xml声明Q因为其只包含ASCII字符QQ何兼容ASCII的编? 对其~码的结果都是相同的。当得到xml declaration中声明的~码Ӟxml processor再{换到该编码对该xmlq行处理。下表来自XML W3C RecommendationQ列Z自动编码的方式Q?

00 00 00 3C
3C 00 00 00
00 00 3C 00
00 3C 00 00
UCS-4 or other encoding with a 32-bit code unit and ASCII characters encoded as ASCII values, in respectively big-endian (1234), little-endian (4321) and two unusual byte orders (2143 and 3412). The encoding declaration must be read to determine which of UCS-4 or other supported 32-bit encodings applies.
00 3C 00 3F UTF-16BE or big-endian ISO-10646-UCS-2 or other encoding with a 16-bit code unit in big-endian order and ASCII characters encoded as ASCII values (the encoding declaration must be read to determine which)
3C 00 3F 00 UTF-16LE or little-endian ISO-10646-UCS-2 or other encoding with a 16-bit code unit in little-endian order and ASCII characters encoded as ASCII values (the encoding declaration must be read to determine which)
3C 3F 78 6D UTF-8, ISO 646, ASCII, some part of ISO 8859, Shift-JIS, EUC, or any other 7-bit, 8-bit, or mixed-width encoding which ensures that the characters of ASCII have their normal positions, width, and values; the actual encoding declaration must be read to detect which of these applies, but since all of these encodings use the same bit patterns for the relevant ASCII characters, the encoding declaration itself may be read reliably
4C 6F A7 94 EBCDIC (in some flavor; the full encoding declaration must be read to tell which code page is in use)
Other UTF-8 without an encoding declaration, or else the data stream is mislabeled (lacking a required encoding declaration), corrupt, fragmentary, or enclosed in a wrapper of some kind


TonyZhangtl 2009-12-09 20:27 发表评论
]]>
Servlet 利用jxl讉Kexcelhttp://www.aygfsteel.com/TonyZhangtl/archive/2009/12/06/304921.htmlTonyZhangtlTonyZhangtlSun, 06 Dec 2009 09:42:00 GMThttp://www.aygfsteel.com/TonyZhangtl/archive/2009/12/06/304921.htmlhttp://www.aygfsteel.com/TonyZhangtl/comments/304921.htmlhttp://www.aygfsteel.com/TonyZhangtl/archive/2009/12/06/304921.html#Feedback1http://www.aygfsteel.com/TonyZhangtl/comments/commentRss/304921.htmlhttp://www.aygfsteel.com/TonyZhangtl/services/trackbacks/304921.html 需要把jar包放在web-inf/lib目录下再加蝲才可以解册个问题?br />
package tony.servlet.example;

import java.io.IOException;
import java.io.OutputStream;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import jxl.Workbook;
import jxl.write.Label;
import jxl.write.WritableSheet;
import jxl.write.WritableWorkbook;

public class Hello extends HttpServlet {
    protected void service(HttpServletRequest request,
            HttpServletResponse response) throws ServletException, IOException {
        // ServletOutputStream out = response.getOutputStream();
        // PrintWriter out = response.getWriter();
        // out.println("Hello world!");
        // System.out.println("TEST");
        // request.getRequestDispatcher("/WEB-INF/jspfooder/test1.html").forward(request,
        // response);
        // request.getRequestDispatcher("test.jsp").forward(request, response);
        // request.getRequestDispatcher("/WEB-INF/test.jsp").forward(request,
        // response);
        /*
         * response.setContentType("application/vnd.ms-excel");
         * response.setHeader("Content-disposition","filename="+ "Example.xls"
         * ); HSSFWorkbook demoWorkBook = new HSSFWorkbook(); HSSFSheet sheet =
         * demoWorkBook.createSheet("账号详单"); HSSFRow row = sheet.createRow(0);
         * HSSFCell cell = row.createCell(0); cell.setCellValue(11);
         * ServletOutputStream out = response.getOutputStream();
         * demoWorkBook.write(out); out.flush(); out.close();
         */
        OutputStream out = response.getOutputStream();
        try {

            response.setContentType("application/vnd.ms-excel");

            response.setHeader("Content-Disposition",
                    "attachment; filename=example.xls");

            WritableWorkbook w = Workbook.createWorkbook(out);
            WritableSheet s = w.createSheet("sheet1", 0);

            s.addCell(new Label(0, 0,
                    "this is my first servlet & sheet example."));
            w.write();
            w.close();

        } catch (Exception e) {
            throw new ServletException("Exception in Excel Sample Servlet", e);
        } finally {
            if (out != null)
                out.close();
        }
    }
}




TonyZhangtl 2009-12-06 17:42 发表评论
]]>
Difference between JavaBean and EJBhttp://www.aygfsteel.com/TonyZhangtl/archive/2009/12/05/304843.htmlTonyZhangtlTonyZhangtlSat, 05 Dec 2009 05:05:00 GMThttp://www.aygfsteel.com/TonyZhangtl/archive/2009/12/05/304843.htmlhttp://www.aygfsteel.com/TonyZhangtl/comments/304843.htmlhttp://www.aygfsteel.com/TonyZhangtl/archive/2009/12/05/304843.html#Feedback0http://www.aygfsteel.com/TonyZhangtl/comments/commentRss/304843.htmlhttp://www.aygfsteel.com/TonyZhangtl/services/trackbacks/304843.html
EJB与JavaBean之区?/font>
[日期]Q?2006-08-17  [来源]Q?  [作者]Q?
EJB 不是一般的JavaBean,EJB是企业JavaBean,EJB一共分?U?实体Bean,消息Bean,会话Bean,书写EJB是需要遵循一 定的规范?具体规范你可以参考相关的资料.另外,要运行EJB,你需要相应的EJB容器,比如Weblogic,Jboss{?而JavaBean不需 ?只需要安装Tomcat可以了
.EJB用于服务端应用开? 而JavaBeans用于客户端应用开?br /> 也可以用JavaBeansq行服务端应用开发,但JavaBeans模型没有提供服务框架Q当应用需要用系l服务Q如事务理,安全?生命周期理{)Ӟ不适合?br />
2.EJB构g是可部v?EJB构g可以作ؓ独立的单元被部v到EJB应用服务器上Q是应用构gQapplication componentsQ?而JavaBeans构g是不可部|的, JavaBeans构g是开发构Ӟ不能被部|ؓ独立的单元?br />
3.EJB构g是部|可定制?使用部v描述W可以在部vEJB时对其运行时配置q行定制,而JavaBeans构g在部|时不能q行定制,JavaBeans构g的定制仅发生在开发阶D?只能利用开发工具创建ƈl装JavaBeans构gQ部|时不能定制

4.EJB构g是分布式对象,可以被客户应用或者其它EJB构gq行q程讉K,而JavaBeans构g不是分布式对?JavaBeans构g只能在其构成的应用中使用,不能提供q程讉K能力

5.EJB构g对终端用户不可见,q行在服务端Q没有hZ互界?而部分JavaBeans构g对终端用户可?如GUI应用中用的按钮构g.

Java bean is just a set of conventions. EJB is a standard for J2EE business components.

Specifically a Java bean:

  • has a public default constructor;
  • readable propertiy methods prepended with "get";
  • writable propertty methods prepended with "set"; and
  • is Serializable.

For example, a Java bean with a property of "margin" would minimally look like this:

public class MyBean implements Serializable {
 
private int margin;

 
public MyBean() { }
 
public int getMargin() { return margin; }
 
public void setMargin(int margin) { this.margin = margin; }
}

EJB, despite the name, is almost completely unrelated.


JavaBeans:-
---------
Basically used to CUSTOMIZE EXISTING OBJECTS. i.e. You can
create USER OBJECTS, which are based on existing objects.
For Example: A default button operates as a Single-State Switch. i.e. when you press a button on a web page, it doesn't remain pressed. Infact, it immediately bounces back to its OFF state like a Door-Bell.

Now, let's say, you need a button, which should have 2 stable states, like the typical Electrical Light Switch. So, in this case, what you can do is, take an existing button (having 1 stable state) and CUSTOMIZE it so that it has 2 stable states.
This is possible using JavaBeans.

Enterprise Java Beans (EJB):-
---------------------------
EJB is a completely different concept than the one mentioned
above. It is NOT used to customize existing objects. Instead
they are basically used to STANDARDIZE the way, in which
business logic is written.
For Example: We can write our business logic as well as the GUI logic, inside Servlets/Applets/StandAlone applications itself. But this way,there will be no clear distinction between the Code that is responsible for the GUI and the actual Business logic code, because everything is written inside the same class file.

So, to COMPONENTIZE we write business logic in seperate class files than the GUI logic, thereby making a clear distinction between the reponsibilities


有一些基本相同之处。它们都是用一l特性创建,以执行其特定d的对象或lg。它们还有从当前所ȝ服务器上的容器获得其它特性的能力。这使得   bean   的行为根据特定Q务和所在环境的不同而有所不同? 
        不同的是Q? 
        EJB   是设计成q行在服务器上,q由客户用的非可视远E对象。可通过多个非可?  JavaBean   构徏   EJB。它们有一个部|描q符Q其目的?  JavaBean   属性相同:它是以后可由工具d?  bean   的描q。EJB   q独立于q_Q一旦编写好Q还可以在Q何支?  Java   的^収ͼ包括客户机和服务器)上用? 
        EJB是一U非可视化的构gQ完全位于服务器端,规范说明详细说明了EJB容器需要满的需求以及如何和EJB构g怺协作。EJB可以和远E的客户端程 序通讯Qƈ提供一定的功能Q根据规范说明,EJB是clientQServerpȝ的一部分Q如果不和客LE序交互QEJB一般不执行具体的功 能,EJB和JavaBean的一个重要区别是EJB必须在网l计环境下使用才有意义? 
  EJB的重Ҏl出服务框架模型Q以保证Java构g可以q行可移植性的部vQ因此,在EJB规格说明中,q没有提CӞ因ؓ典型的EJB构g不发 送和接收事gQEJB规范说明中也没有提到属性。和一般的JavaBean一PEJB是高度可定制的,对EJBq行定制不需要存取源代码Q但对EJB? 以进行定制不是在开发阶D,而是在部|阶D는部v描述W进行定制? 
  需要说明的是,JavaBean不仅可用于客L应用E序的开发,也可以用于服务器端应用程序的开发,但和EJB的区别是Q如果用JavaBean? 建服务器端应用程序,q必d时实现服务框Ӟ在多层结构分布式应用pȝ中,服务框架的实现是非常J琐的,对于EJB来说Q服务框架已l提供,因此大大 化了pȝ的开发过E?/p>


我了省时_我给你一份文档吧Q是专门介绍二者区别的? 
   
  java   bean   ?  ejb的区? 
   
  您现在可能已在?  JavaBeanQ但q不了解它。如果有支持   Java   的浏览器Q那么,在桌面上使用   JavaBean   没有限制。用的   Web   面可以?  bean   作ؓ应用程序的一部分。您很快׃和作为浏览器可视部分?  JavaBean   交互Q然后,那些   JavaBean   与服务器上?  EJB   接口。这U能力也可以扩展到因特网和内部网?  
   
  JavaBean   ?  Server   BeanQ通常UCؓ   Enterprise   JavaBean   (EJB)Q有一些基本相同之处。它们都是用一l特性创建,以执行其特定d的对象或lg。它们还有从当前所ȝ服务器上的容器获得其它特性的能力。这? ?  bean   的行为根据特定Q务和所在环境的不同而有所不同? 
   
  q开辟了巨大商机。因?  JavaBean   是与q_无关的,所以对于将来的解决ҎQ供应商可以L向不同用h出其客户机方?  JavaBeanQ而不必创建或l护不同的版本。这?  JavaBean   可以与执行商业功能(例如订购、信用卡处理、电子汇ƾ、存货分配、运输等Q的   EJB   配合使用。这里有巨大潜力Q而这正是lg代理QWebSphere   Application   Server   企业版)设计提供的那U潜力?  
   
  JavaBean   是一U组Ӟ它在内部有接口或有与其相关的属性,以便不同人在不同旉开发的   bean   可以询问和集成。可以构Z?  beanQ而在以后构造时其与其?  bean   l定。这U过E提供了先构建,然后重复使用的方法,q就是组件的概念。可以将q种单一应用E序部v成独立程序、ActiveX   lg或在览器中?  
   
  JavaBean   因其外部接口Q即属性接口)而与U对象不同。这U接口允许工兯取组件要执行的功能,其与其?  bean   挂钩Q以及将其插入其它环境。JavaBean   设计成对单一q程而言是本地的Q它们在q行旉常可视。这U可视组件可能是按钮、列表框、图形或图表   -   但这不是必需的? 
   
  可执行组?   
  Server   Bean   ?  EJB   是部|在服务器上的可执行lg或商业对象。有一个协议允许对其进行远E访问或在特定服务器上安装或部v它们。有一pd机制允许它们服务安全性、事务行 为、ƈ发性(由多个客h同时讉K的能力)和持久性(其状态可以保存多久)的主要方面授权给   EJB   服务器上其所在的容器。当安装在容器中Ӟ它们获得各自的行为,该行为提供不同质量的服务Q因此,选择正确?  EJB   服务器至关重要。这正是   IBM   WebSphere   企业版的优势所在? 
   
  EJB   是设计成q行在服务器上,q由客户用的非可视远E对象。可通过多个非可?  JavaBean   构徏   EJB。它们有一个部|描q符Q其目的?  JavaBean   属性相同:它是以后可由工具d?  bean   的描q。EJB   q独立于q_Q一旦编写好Q还可以在Q何支?  Java   的^収ͼ包括客户机和服务器)上用? 
   
  因ؓ   EJB   p?  IBM   VisualAge   for   Java   q样的工具集生成Q所以,它是Z服务器的对象Qƈ用于q程调用。它们安装在   EJB   服务器上Qƈ象调用其?  CORBA   q程对象那样获得q行调用的远E接口? 
   
  ActiveX   对象    
  可以?  JavaBean   部v?  ActiveX   对象Q虽?  EJB   的代理也可以q样做,但是Q因?  ActiveX   q行在桌面上Q所以,EJB   本n不能成ؓ   ActiveX   对象。要在与q_相关的、仅   Windows   q_上做到这一点,开发h员可以将   JavaBean   变换?  ActiveX   lg? 
   
  好处    
  EJB   的主要好处在于:构徏   bean   Ӟbean   开发h员可以规定需要什么类型的行ؓQ而不必规定如何去做。开发分Z部分Q程序员开?  beanQ然后验证:它可与构建工具一起工作,q包括标识所需服务质量行ؓU类的部|描q符。下一步,另一个程序员可以采用q个   beanQƈ使用d   EJB   部v描述W的部v工具Q然后将?  bean   安装?  Enterprise   Java   Server   上的容器中。在W二步中Q部|工具采取一些操?  -   q可能意味着生成如状态保存代码,攑օ事务挂钩Q或执行安全性检查这L代码。所有这些操作由部v工具生成Qbean   开发h员和部v人员可以是不同的人? 
   
  可以通过使用部v工具Q将M独立于^台的   JavaBean   改写成具有可靠服务质量、特定于q_?  EJBQ以满现有商业pȝ和应用程序的特定需求。这是   EJB   服务器对集成pȝ、网l和体系l构如此重要的原因所在? 
   
  EJB   ?  IBM   WebSphere   企业?   
  ?  IBM   WebSphere   企业版中使用Ӟ可以?  EJB   配置成被理的商业对象。接受它们授权服务的容器是其安装到的容器。将   EJB   的持久性部分映在数据或状态对象中。EJB   服务器ؓ   EJB   提供不同的服务质量,选择正确?  EJB   服务器可能对满完整的商业需求至关重要?#8220;lg代理”功能极其健壮Q该功能提供如负载均衡和支持服务器组中多台机器的高功能。它q有大大出   Enterprise   Java   Server   (EJS)   规范所倡导的系l管理功能。因此,按照基本标准~写?  JavaBean   ?  EJB   可以q行在?#8220;lg代理”功能?  WebSphere   企业版上Qƈ获得那些所有的附加功能?  
   
  EJB   服务器还提供独特的特性和服务质量Q而且不完全相同。IBM“lg代理”有一些强大特?  -   例如Q可伸羃性,它允许开发h员将   EJB   部vC型pȝ到大型网l的不同cd服务器。开发h员可以从处入手Q例如,在一个部门中Q首先在   LAN   ?  Java   服务器上部vQ一旦准备好Q就知道可以在那里创徏?  JavaBean   ?  EJB   部v到全球网l。然后,开发h员可以测试ƈ熟悉q些   beanQ试q行Q制作样本等{。满意之后,开发h员可以通过其U至高性能服务器,来大q度扩大其规模。JavaBean   ?  EJB   不受M计算Zpȝ构边界的限制。它们用   Java   ~写Q可以运行在Mh   Java   虚拟机的pȝ上,q可以用Q?  Enterprise   Java   Server   (EJS)   来部|对象。因此,开发h员现在可以在方便的系l上构徏Q以后在方便的系l上部vQ而不必是同一台或同样cd的机器? 
   
  IBM   WebSphere   企业版支持将商业对象部v到多台服务器。EJB   作ؓ商业对象集成?#8220;lg代理”功能Qƈ作ؓM其它商业对象处理。因此,EJB   可以q接到所选的后端pȝQƈ执行M所需操作Q以满其商业需求。这成?#8220;lg代理”?  EJB   提供的基设施。通过?#8220;lg代理”用作   EJB   服务器,开发h员将能够l箋使用当前旧有pȝQƈ其与电子商务接口一h供? 
   
  Z   EJB   能在   WebSphere“lg代理”环境中工作,可以使用“lg代理”部v工具其安装在一台或多台服务器上Q然后将其添加到命名服务器,以便可以全局查找? 它。Q何可以访问公共命名服务器的h都可以找到它Q找到其宿主Qƈ可以在宿M执行ҎQ同时创?  EJB。这是“代理lg”要做的事? 
   
  CZ    
  让我们D一个在   Web   购物站点上可以看到的电子购物车的例子。用L购物车是一?  JavaBean。用户将货架上的商品攑օ购物车,q些商品本n?  JavaBean。它们全部可视,q且面向用户。结帐时Q将用户购物车中的商品发送到服务器上?  EJBQ该   EJB   执行一些必要的操作Q如查信用卡授权和可用额度,生成条Q或生成l发货部门的有关提什么货和发货地点的Ҏ指示   -   q就是商业程序已在进行的zd? 
   
  l束?   
  Bean   的全部意义不只是其现有能力,更在于其可以为商业提供的有竞争力的潜在能力。IT   设计师和应用开发h员现在可以将_֊完全集中在商业逻辑Q而将如事务、持久性和安全性的底层工作留给服务器。WebSphere   ?#8220;lg代理”功能提供所有这些(q有后端讉KQ和对象事务理器?/p>







TonyZhangtl 2009-12-05 13:05 发表评论
]]>
web server & application serverhttp://www.aygfsteel.com/TonyZhangtl/archive/2009/12/02/304554.htmlTonyZhangtlTonyZhangtlWed, 02 Dec 2009 13:29:00 GMThttp://www.aygfsteel.com/TonyZhangtl/archive/2009/12/02/304554.htmlhttp://www.aygfsteel.com/TonyZhangtl/comments/304554.htmlhttp://www.aygfsteel.com/TonyZhangtl/archive/2009/12/02/304554.html#Feedback0http://www.aygfsteel.com/TonyZhangtl/comments/commentRss/304554.htmlhttp://www.aygfsteel.com/TonyZhangtl/services/trackbacks/304554.htmlA Web server exclusively handles HTTP requests, whereas an application server serves business logic to application programs through any number of protocols.

Let's examine each in more detail.

The Web server

A Web server handles the HTTP protocol. When the Web server receives an HTTP request, it responds with an HTTP response, such as sending back an HTML page. To process a request, a Web server may respond with a static HTML page or image, send a redirect, or delegate the dynamic response generation to some other program such as CGI scripts, JSPs (JavaServer Pages), servlets, ASPs (Active Server Pages), server-side JavaScripts, or some other server-side technology. Whatever their purpose, such server-side programs generate a response, most often in HTML, for viewing in a Web browser.

Understand that a Web server's delegation model is fairly simple. When a request comes into the Web server, the Web server simply passes the request to the program best able to handle it. The Web server doesn't provide any functionality beyond simply providing an environment in which the server-side program can execute and pass back the generated responses. The server-side program usually provides for itself such functions as transaction processing, database connectivity, and messaging.

While a Web server may not itself support transactions or database connection pooling, it may employ various strategies for fault tolerance and scalability such as load balancing, caching, and clustering—features oftentimes erroneously assigned as features reserved only for application servers.

The application server

As for the application server, according to our definition, an application server exposes business logic to client applications through various protocols, possibly including HTTP. While a Web server mainly deals with sending HTML for display in a Web browser, an application server provides access to business logic for use by client application programs. The application program can use this logic just as it would call a method on an object (or a function in the procedural world).

Such application server clients can include GUIs (graphical user interface) running on a PC, a Web server, or even other application servers. The information traveling back and forth between an application server and its client is not restricted to simple display markup. Instead, the information is program logic. Since the logic takes the form of data and method calls and not static HTML, the client can employ the exposed business logic however it wants.

In most cases, the server exposes this business logic through a component API, such as the EJB (Enterprise JavaBean) component model found on J2EE (Java 2 Platform, Enterprise Edition) application servers. Moreover, the application server manages its own resources. Such gate-keeping duties include security, transaction processing, resource pooling, and messaging. Like a Web server, an application server may also employ various scalability and fault-tolerance techniques.



TonyZhangtl 2009-12-02 21:29 发表评论
]]>
【{】详解Java解析XML的四U方?/title><link>http://www.aygfsteel.com/TonyZhangtl/archive/2009/12/02/304553.html</link><dc:creator>TonyZhangtl</dc:creator><author>TonyZhangtl</author><pubDate>Wed, 02 Dec 2009 13:16:00 GMT</pubDate><guid>http://www.aygfsteel.com/TonyZhangtl/archive/2009/12/02/304553.html</guid><wfw:comment>http://www.aygfsteel.com/TonyZhangtl/comments/304553.html</wfw:comment><comments>http://www.aygfsteel.com/TonyZhangtl/archive/2009/12/02/304553.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.aygfsteel.com/TonyZhangtl/comments/commentRss/304553.html</wfw:commentRss><trackback:ping>http://www.aygfsteel.com/TonyZhangtl/services/trackbacks/304553.html</trackback:ping><description><![CDATA[<p class="con">XML现在已经成ؓ一U通用的数据交换格?q_的无x得很多场合都需要用到XML。本文将详细介绍用Java解析XML的四U方法?/p> <p> </p> <p>XML现在已经成ؓ一U通用的数据交换格?它的q_无关?语言无关 ?pȝ无关?l数据集成与交互带来了极大的方便。对于XML本n的语法知识与技术细?需要阅ȝ关的技术文?q里面包括的内容? DOM(Document Object Model),DTD(Document Type Definition),SAX(Simple API for XML),XSD(Xml Schema Definition),XSLT(Extensible Stylesheet Language Transformations),具体可参阅w3c官方|站文档http://www.w3.org获取更多信息?/p> <p>XML在不同的语言里解析方式都是一L,只不q实现的语法不同而已。基本的解析方式有两U?一U叫SAXQ另一U叫DOM。SAX是基于事件流的解?DOM是基于XML文档树结构的解析。假设我们XML的内容和l构如下: </p> <p> <table bordercolordark="#ffffff" bordercolorlight="#999999" width="400" align="center" border="1" cellpadding="2" cellspacing="0"> <tbody> <tr> <td class="code" bgcolor="#e6e6e6"> <pre><?xml version="1.0" encoding="UTF-8"?> <br /> <employees> <br /> <employee> <br /> <name>ddviplinux</name> <br /> <sex>m</sex> <br /> <age>30</age> <br /> </employee> <br /> </employees></pre> </td> </tr> </tbody> </table> </p> <p>本文使用JAVA语言来实现DOM与SAX的XML文档生成与解析?<br /> 首先定义一个操作XML文档的接口XmlDocument 它定义了XML文档的徏立与解析的接口?/p> <p> <table bordercolordark="#ffffff" bordercolorlight="#999999" width="400" align="center" border="1" cellpadding="2" cellspacing="0"> <tbody> <tr> <td class="code" bgcolor="#e6e6e6"> <pre>package com.alisoft.facepay.framework.bean; <br /> /** <br /> * <br /> * @author hongliang.dinghl <br /> * 定义XML文档建立与解析的接口 <br /> */ <br /> public interface XmlDocument { <br /> /** <br /> * 建立XML文档 <br /> * @param fileName 文g全\径名U?<br /> */ <br /> public void createXml(String fileName); <br /> /** <br /> * 解析XML文档 <br /> * @param fileName 文g全\径名U?<br /> */ <br /> public void parserXml(String fileName); <br /> }</pre> </td> </tr> </tbody> </table> </p> <p><strong>1.DOM生成和解析XML文档</strong></p> <p>? XML 文档的已解析版本定义了一l接口。解析器d整个文档Q然后构Z个驻留内存的树结构,然后代码可以?DOM 接口来操作这个树l构。优点:整个文档树在内存中,便于操作Q支持删除、修攏V重新排列等多种功能Q缺点:整个文档调入内存(包括无用的节点)Q浪Ҏ 间和I间Q用场合:一旦解析了文档q需多次讉Kq些数据Q硬件资源充I内存、CPUQ?</p> <p> </p> <div align="center"> <div style="border: 1px solid #cccccc; padding: 0px 0px 6px 10px; overflow: auto; margin-left: auto; width: 517px; margin-right: auto; height: 166px;"> <p align="left"> </p> <div align="left"> <pre>package com.alisoft.facepay.framework.bean; <br /> import java.io.FileInputStream; <br /> import java.io.FileNotFoundException; <br /> import java.io.FileOutputStream; <br /> import java.io.IOException; <br /> import java.io.InputStream; <br /> import java.io.PrintWriter; <br /> import javax.xml.parsers.DocumentBuilder; <br /> import javax.xml.parsers.DocumentBuilderFactory; <br /> import javax.xml.parsers.ParserConfigurationException; <br /> import javax.xml.transform.OutputKeys; <br /> import javax.xml.transform.Transformer; <br /> import javax.xml.transform.TransformerConfigurationException; <br /> import javax.xml.transform.TransformerException; <br /> import javax.xml.transform.TransformerFactory; <br /> import javax.xml.transform.dom.DOMSource; <br /> import javax.xml.transform.stream.StreamResult; <br /> import org.w3c.dom.Document; <br /> import org.w3c.dom.Element; <br /> import org.w3c.dom.Node; <br /> import org.w3c.dom.NodeList; <br /> import org.xml.sax.SAXException; <br /> /** <br /> * <br /> * @author hongliang.dinghl <br /> * DOM生成与解析XML文档 <br /> */ <br /> public class DomDemo implements XmlDocument { <br /> private Document document; <br /> private String fileName; <br /> public void init() { <br /> try { <br /> DocumentBuilderFactory factory = DocumentBuilderFactory <br /> .newInstance(); <br /> DocumentBuilder builder = factory.newDocumentBuilder(); <br /> this.document = builder.newDocument(); <br /> } catch (ParserConfigurationException e) { <br /> System.out.println(e.getMessage()); <br /> } <br /> } <br /> public void createXml(String fileName) { <br /> Element root = this.document.createElement("employees"); <br /> this.document.appendChild(root); <br /> Element employee = this.document.createElement("employee"); <br /> Element name = this.document.createElement("name"); <br /> name.appendChild(this.document.createTextNode("丁宏?)); <br /> employee.appendChild(name); <br /> Element sex = this.document.createElement("sex"); <br /> sex.appendChild(this.document.createTextNode("m")); <br /> employee.appendChild(sex); <br /> Element age = this.document.createElement("age"); <br /> age.appendChild(this.document.createTextNode("30")); <br /> employee.appendChild(age); <br /> root.appendChild(employee); <br /> TransformerFactory tf = TransformerFactory.newInstance(); <br /> try { <br /> Transformer transformer = tf.newTransformer(); <br /> DOMSource source = new DOMSource(document); <br /> transformer.setOutputProperty(OutputKeys.ENCODING, "gb2312"); <br /> transformer.setOutputProperty(OutputKeys.INDENT, "yes"); <br /> PrintWriter pw = new PrintWriter(new FileOutputStream(fileName)); <br /> StreamResult result = new StreamResult(pw); <br /> transformer.transform(source, result); <br /> System.out.println("生成XML文g成功!"); <br /> } catch (TransformerConfigurationException e) { <br /> System.out.println(e.getMessage()); <br /> } catch (IllegalArgumentException e) { <br /> System.out.println(e.getMessage()); <br /> } catch (FileNotFoundException e) { <br /> System.out.println(e.getMessage()); <br /> } catch (TransformerException e) { <br /> System.out.println(e.getMessage()); <br /> } <br /> } <br /> public void parserXml(String fileName) { <br /> try { <br /> DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance(); <br /> DocumentBuilder db = dbf.newDocumentBuilder(); <br /> Document document = db.parse(fileName); <br /> NodeList employees = document.getChildNodes(); <br /> for (int i = 0; i < employees.getLength(); i++) { <br /> Node employee = employees.item(i); <br /> NodeList employeeInfo = employee.getChildNodes(); <br /> for (int j = 0; j < employeeInfo.getLength(); j++) { <br /> Node node = employeeInfo.item(j); <br /> NodeList employeeMeta = node.getChildNodes(); <br /> for (int k = 0; k < employeeMeta.getLength(); k++) { <br /> System.out.println(employeeMeta.item(k).getNodeName() <br /> + ":" + employeeMeta.item(k).getTextContent()); <br /> } <br /> } <br /> } <br /> System.out.println("解析完毕"); <br /> } catch (FileNotFoundException e) { <br /> System.out.println(e.getMessage()); <br /> } catch (ParserConfigurationException e) { <br /> System.out.println(e.getMessage()); <br /> } catch (SAXException e) { <br /> System.out.println(e.getMessage()); <br /> } catch (IOException e) { <br /> System.out.println(e.getMessage()); <br /> } <br /> } <br /> }</pre> </div> <p align="left"> </p> </div> </div> <p><strong>2.SAX生成和解析XML文档</strong></p> <p>? 解决DOM的问题,出现了SAX。SAX Q事仉动。当解析器发现元素开始、元素结束、文本、文档的开始或l束{时Q发送事ӞE序员编写响应这些事件的代码Q保存数据。优点:不用事先调入整个 文档Q占用资源少QSAX解析器代码比DOM解析器代码小Q适于AppletQ下载。缺点:不是持久的;事gq后Q若没保存数据,那么数据׃了;无状? 性;从事件中只能得到文本Q但不知该文本属于哪个元素;使用场合QApplet;只需XML文档的少量内容,很少回头讉KQ机器内存少Q?/p> <p>Java代码</p> <p> </p> <div align="center"> <p align="left"> </p> <div style="border: 1px solid #cccccc; padding: 0px 0px 6px 10px; overflow: auto; margin-left: auto; width: 517px; margin-right: auto; height: 166px;"> <p> </p> <pre>package com.alisoft.facepay.framework.bean;   <br /> import java.io.FileInputStream;   <br /> import java.io.FileNotFoundException;   <br /> import java.io.IOException;   <br /> import java.io.InputStream;   <br /> <br /> import javax.xml.parsers.ParserConfigurationException;   <br /> import javax.xml.parsers.SAXParser;   <br /> import javax.xml.parsers.SAXParserFactory;   <br /> <br /> import org.xml.sax.Attributes;   <br /> import org.xml.sax.SAXException;   <br /> import org.xml.sax.helpers.DefaultHandler;   <br /> /** <br /> *   <br /> * @author hongliang.dinghl <br /> * SAX文档解析 <br /> */ <br /> public class SaxDemo implements XmlDocument {   <br /> <br /> public void createXml(String fileName) {   <br /> System.out.println("<<"+filename+">>");   <br /> }   <br /> <br /> public void parserXml(String fileName) {   <br /> SAXParserFactory saxfac = SAXParserFactory.newInstance();   <br /> <br /> try {   <br /> <br /> SAXParser saxparser = saxfac.newSAXParser();   <br /> <br /> InputStream is = new FileInputStream(fileName);   <br /> <br /> saxparser.parse(is, new MySAXHandler());   <br /> <br /> } catch (ParserConfigurationException e) {   <br /> <br /> e.printStackTrace();   <br /> <br /> } catch (SAXException e) {   <br /> <br /> e.printStackTrace();   <br /> <br /> } catch (FileNotFoundException e) {   <br /> <br /> e.printStackTrace();   <br /> <br /> } catch (IOException e) {   <br /> <br /> e.printStackTrace();   <br /> <br /> }   <br /> <br /> }   <br /> <br /> }   <br /> <br /> class MySAXHandler extends DefaultHandler {   <br /> <br /> boolean hasAttribute = false;   <br /> <br /> Attributes attributes = null;   <br /> <br /> public void startDocument() throws SAXException {   <br /> <br /> System.out.println("文档开始打C");   <br /> <br /> }   <br /> <br /> public void endDocument() throws SAXException {   <br /> <br /> System.out.println("文档打印l束?);   <br /> <br /> }   <br /> <br /> public void startElement(String uri, String localName, String qName,   <br /> <br /> Attributes attributes) throws SAXException {   <br /> <br /> if (qName.equals("employees")) {   <br /> <br /> return;   <br /> <br /> }   <br /> <br /> if (qName.equals("employee")) {   <br /> <br /> System.out.println(qName);   <br /> <br /> }   <br /> <br /> if (attributes.getLength() > 0) {   <br /> <br /> this.attributes = attributes;   <br /> <br /> this.hasAttribute = true;   <br /> <br /> }   <br /> <br /> }   <br /> <br /> public void endElement(String uri, String localName, String qName)   <br /> <br /> throws SAXException {   <br /> <br /> if (hasAttribute && (attributes != null)) {   <br /> <br /> for (int i = 0; i < attributes.getLength(); i++) {   <br /> <br /> System.out.println(attributes.getQName(0)   <br /> + attributes.getValue(0));   <br /> <br /> }   <br /> <br /> }   <br /> <br /> }   <br /> <br /> public void characters(char[] ch, int start, int length)   <br /> <br /> throws SAXException {   <br /> <br /> System.out.println(new String(ch, start, length));   <br /> <br /> }   <br /> <br /> } <br /> package com.alisoft.facepay.framework.bean; <br /> import java.io.FileInputStream; <br /> import java.io.FileNotFoundException; <br /> import java.io.IOException; <br /> import java.io.InputStream; <br /> import javax.xml.parsers.ParserConfigurationException; <br /> import javax.xml.parsers.SAXParser; <br /> import javax.xml.parsers.SAXParserFactory; <br /> import org.xml.sax.Attributes; <br /> import org.xml.sax.SAXException; <br /> import org.xml.sax.helpers.DefaultHandler; <br /> /** <br /> * <br /> * @author hongliang.dinghl <br /> * SAX文档解析 <br /> */ <br /> public class SaxDemo implements XmlDocument { <br /> public void createXml(String fileName) { <br /> System.out.println("<<"+filename+">>"); <br /> } <br /> public void parserXml(String fileName) { <br /> SAXParserFactory saxfac = SAXParserFactory.newInstance(); <br /> try { <br /> SAXParser saxparser = saxfac.newSAXParser(); <br /> InputStream is = new FileInputStream(fileName); <br /> saxparser.parse(is, new MySAXHandler()); <br /> } catch (ParserConfigurationException e) { <br /> e.printStackTrace(); <br /> } catch (SAXException e) { <br /> e.printStackTrace(); <br /> } catch (FileNotFoundException e) { <br /> e.printStackTrace(); <br /> } catch (IOException e) { <br /> e.printStackTrace(); <br /> } <br /> } <br /> } <br /> class MySAXHandler extends DefaultHandler { <br /> boolean hasAttribute = false; <br /> Attributes attributes = null; <br /> public void startDocument() throws SAXException { <br /> System.out.println("文档开始打C"); <br /> } <br /> public void endDocument() throws SAXException { <br /> System.out.println("文档打印l束?); <br /> } <br /> public void startElement(String uri, String localName, String qName, <br /> Attributes attributes) throws SAXException { <br /> if (qName.equals("employees")) { <br /> return; <br /> } <br /> if (qName.equals("employee")) { <br /> System.out.println(qName); <br /> } <br /> if (attributes.getLength() > 0) { <br /> this.attributes = attributes; <br /> this.hasAttribute = true; <br /> } <br /> } <br /> public void endElement(String uri, String localName, String qName) <br /> throws SAXException { <br /> if (hasAttribute && (attributes != null)) { <br /> for (int i = 0; i < attributes.getLength(); i++) { <br /> System.out.println(attributes.getQName(0) <br /> + attributes.getValue(0)); <br /> } <br /> } <br /> } <br /> public void characters(char[] ch, int start, int length) <br /> throws SAXException { <br /> System.out.println(new String(ch, start, length)); <br /> } <br /> }</pre> <p> </p> </div> <p align="left"> </p> </div> <div> </div> <p><strong>3.DOM4J生成和解析XML文档</strong></p> <p>DOM4J 是一个非帔R怼U的Java XML APIQ具有性能优异、功能强大和极端易用使用的特点,同时它也是一个开放源代码的Y件。如今你可以看到来多?Java 软g都在使用 DOM4J 来读?XMLQ特别值得一提的是连 Sun ?JAXM 也在?DOM4J?/p> <p>Java代码</p> <p> </p> <div align="center"> <div style="border: 1px solid #cccccc; padding: 0px 0px 6px 10px; overflow: auto; margin-left: auto; width: 517px; margin-right: auto; height: 166px;"> <p align="left"> </p> <div align="left"> <pre>package com.alisoft.facepay.framework.bean;   <br /> import java.io.File;   <br /> import java.io.FileWriter;   <br /> import java.io.IOException;   <br /> import java.io.Writer;   <br /> import java.util.Iterator;   <br /> <br /> import org.dom4j.Document;   <br /> import org.dom4j.DocumentException;   <br /> import org.dom4j.DocumentHelper;   <br /> import org.dom4j.Element;   <br /> import org.dom4j.io.SAXReader;   <br /> import org.dom4j.io.XMLWriter;   <br /> /** <br /> *   <br /> * @author hongliang.dinghl <br /> * Dom4j 生成XML文档与解析XML文档 <br /> */ <br /> public class Dom4jDemo implements XmlDocument {   <br /> <br /> public void createXml(String fileName) {   <br /> Document document = DocumentHelper.createDocument();   <br /> Element employees=document.addElement("employees");   <br /> Element employee=employees.addElement("employee");   <br /> Element name= employee.addElement("name");   <br /> name.setText("ddvip");   <br /> Element sex=employee.addElement("sex");   <br /> sex.setText("m");   <br /> Element age=employee.addElement("age");   <br /> age.setText("29");   <br /> try {   <br /> Writer fileWriter=new FileWriter(fileName);   <br /> XMLWriter xmlWriter=new XMLWriter(fileWriter);   <br /> xmlWriter.write(document);   <br /> xmlWriter.close();   <br /> } catch (IOException e) {   <br /> <br /> System.out.println(e.getMessage());   <br /> }   <br /> <br /> <br /> }   <br /> <br /> <br /> public void parserXml(String fileName) {   <br /> File inputXml=new File(fileName);   <br /> SAXReader saxReader = new SAXReader();   <br /> try {   <br /> Document document = saxReader.read(inputXml);   <br /> Element employees=document.getRootElement();   <br /> for(Iterator i = employees.elementIterator(); i.hasNext();){   <br /> Element employee = (Element) i.next();   <br /> for(Iterator j = employee.elementIterator(); j.hasNext();){   <br /> Element node=(Element) j.next();   <br /> System.out.println(node.getName()+":"+node.getText());   <br /> }   <br /> <br /> }   <br /> } catch (DocumentException e) {   <br /> System.out.println(e.getMessage());   <br /> }   <br /> System.out.println("dom4j parserXml");   <br /> }   <br /> }  </pre> </div> <p align="left"> </p> </div> </div> <p> </p> <p><strong>4.JDOM生成和解析XML</strong>  </p> <p>为减DOM、SAX的编码量Q出CJDOMQ优点:20-80原则Q极大减了代码量。用场合:要实现的功能单,如解析、创建等Q但在底层,JDOMq是使用SAXQ最常用Q、DOM、Xanan文档?/p> <p> </p> <p align="left"> </p> <pre>   <br /> <pre class="java" name="code">package com.alisoft.facepay.framework.bean;   <br /> <br /> import java.io.FileNotFoundException;   <br /> import java.io.FileOutputStream;   <br /> import java.io.IOException;   <br /> import java.util.List;   <br /> <br /> import org.jdom.Document;   <br /> import org.jdom.Element;   </pre> </pre> <img src ="http://www.aygfsteel.com/TonyZhangtl/aggbug/304553.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.aygfsteel.com/TonyZhangtl/" target="_blank">TonyZhangtl</a> 2009-12-02 21:16 <a href="http://www.aygfsteel.com/TonyZhangtl/archive/2009/12/02/304553.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>【{】关于JAXPQDOMQSAXQJDOMQDOM4Jhttp://www.aygfsteel.com/TonyZhangtl/archive/2009/12/02/304552.htmlTonyZhangtlTonyZhangtlWed, 02 Dec 2009 13:14:00 GMThttp://www.aygfsteel.com/TonyZhangtl/archive/2009/12/02/304552.htmlhttp://www.aygfsteel.com/TonyZhangtl/comments/304552.htmlhttp://www.aygfsteel.com/TonyZhangtl/archive/2009/12/02/304552.html#Feedback0http://www.aygfsteel.com/TonyZhangtl/comments/commentRss/304552.htmlhttp://www.aygfsteel.com/TonyZhangtl/services/trackbacks/304552.html
2007-07-15 11:33

关于JAXPQDOMQSAXQJDOMQDOM4J的一些想?/p>

q些API是XSLT的关键部分,它们构徏在DOM和SAX解析器基上?/p>

Sun在XML领域L后知后觉Q等到Sun重视XML的时候,XML的API早就满天飞了Q尤其是IBMh非常大的领先优势。不qSun是规? 的制订者,于是参考WOffice:smarttags" />3C的标准制订了JAXP规范。JAXP不像Xerces和Crimon那样Q它只是一个specQ本w是不做M事情的,它的作用是提出一 个统一的接口,让其它的XML API都来遵@JAXP~程Q那么用JAXP写出来的E序Q底层的API可以L切换?/p>

具体来说JAXP包括了几个工厂类Q这是JDK1.4里面的Javax.xml.parsers 包,用来LW合DOM标准的XML API实现cȝ位置Q此外JAXPq包括一整套interfaceQ这是JDK1.4里面的org.w3c.dom那几个包。工厂类负责加蝲DOM的实 现类?/p>

当你严格采用JAXP~程的时候,是遵循W3C的DOm标准的,那么在JAXP底层你实际上可以L切换不同的DOM实现Q例如XercesQ或者CrimonQ再或者其它,切换Ҏ是配置jaxp.properties。因此JAXP是一些标准接口而已?/p>

JAXP应用E序 -> JAXP接口 -> Xerces DOM实现 -> Xerces DOM/SAX 解析?br /> JAXP应用E序 -> JAXP接口 -> Crimson DOM实现 -> Crimson DOM/SAX 解析?br /> JAXP应用E序 -> JAXP接口 -> Crimson DOM实现 -> Xerces DOM/SAX 解析?br />
W3C的DOM标准API隄的让人想撞墙Q于是有一帮h开发Java专用的XML API目的是ؓ了便于用,q就是jdom的由来,开发到一半的时候,另一部分人又分了出来Q他们有自己的想法,于是他们去开发dom4jQŞ成了今天 q样两个APIQ至于他们之间的性能Q功能之比较看看上面我推荐的文章q道了Qjdom全面惨|?/p>

jdom 相当于上面的 JAXP接口 Q?Xerces DOM实现部分Q它本n没有解析器,它可以用Xerces或者Crimson的解析器?br /> JAXP应用E序 -> JAXP接口 -> Xerces DOM实现 -> Crimson DOM/SAX 解析??Xerces DOM/SAX 解析?/p>

jdom应用E序 -> jdom API -> Xerces/Crimson解析?br /> dom4j应用E序 -> dom4j API -> Xerces/Crimson解析?br /> dom4j应用E序 -> dom4j API -> Alfred2解析?/p>

因此可以看出采用dom4j/jdom~写的应用程序,已经不具备可UL性了?/p>

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

我的举例Q?/p>

1Q?nbsp;  仅仅是XSL转换。XMLàHTMLQ通过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)));

q里的stream是一个DOM对象?br /> 我感觉这个就是JAXP应用E序 -> JAXP接口 -> Xerces DOM实现 -> Xerces DOM/SAX 解析?不知道对不对?br />
2Q遍历XMLQ通过DOM。不仅仅是XSL转换。中间有对XML元素内容的操作?br /> 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.DOMParser是Xerces包的一部分?/p>

Import org.apache.xerces.parsers.DOMParser;

Import org.w3c.dom.Document;

Import org.w3c.dom.NodeList;

//DOM遍历XML

DOMParser parser = new DOMParser();

Parser.parse(XMLFileName);//解析q在内存中创建XML树?/p>

Document document = parser.getDocument();//通过Document对象Q可以用内存中的树?/p>

NodeList products = document.getElementByTagName(“product_id”);

Int num_products = products.getLength();

//XSL转化?/p>

TransformerFactory transFactory = TransformerFactory.newInstance();

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

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

我感觉XSL转化和对XML对象的操作是两个q程。可以分别对待。最重要的是对对象的操作。这也就是ؓ什么有DOM,JDOM,DOM4J。{化好像只需要JAXP可以了Q关心的是StreamSource和StreamResult。这两个是DOM对象?/p>


3QJDOM使用Q生成Document内容q保存到XML文g?br /> import org.jdom.Element;
import org.jdom.Document;//和Import org.w3c.dom.DocumentҎ一下。一个是JAXP的一个是JDOM的Document

import org.jdom.output.XMLOutputter;

Element root = Element(“orders”);

root.addContent(“ ”);

org.jdom.Document document = new Document(root);//创徏JDOM树?/p>

FileOutputStream outStream = new FileOutputStream(XMLFileName);

XMLOutputter outToFile = new XMLOutputter();

outToFile.output(document,outStream);

outStream.flush();

outStream.close();

jdom应用E序 -> jdom API -> Xerces/Crimson解析?br /> VS
JAXP应用E序 -> JAXP接口 -> Xerces DOM实现 -> Xerces DOM/SAX 解析?br />
q里的没有Transform的过E,直接把Document的内容存到XML中。没有XSL转化Q没有XSL文g?/p>

JDOM提供了几U输出方法。这里XMLOutputter是保存到文gQ输Z个实际的XML。还有DOMOutputter,在内存中创徏一个传l的DOM树。还有SAXOutputterQ创Z串SAX事g以便被其他对象读取?/p>



4QJDOM使用Q读取已有的XML然后生成DocumentQ修改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是已l存在的根元素?/p>

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

//把document保存到文件中?/p>

FileOutputStream outStream = new FileOutputStream(XMLFileName);

XMLOutputter outToFile = new XMLOutputter();

outToFile.output(document,outStream);

outStream.flush();

outStream.close();

即创徏一个DOM式的l构Q这里仍使用SAXBuilder来做q这件事情?/p>

DOMBuilder和SAXBuilder中的”DOM”?#8221;SAX”指的是用于徏立文档的ҎQ而不是生成的内容?br />
5QXSL转换,能把DOM对象转化成输出,也可以向上面所举例的把XMLFileName的流转化成输出的(文g或屏q显C)。但是不能把JDOM对象转化Q所以需要把JDOM转化成DOM对象Q然后再输出?br /> import org.jdom.Element;
import org.jdom.Document;

import org.jdom.output.XMLOutputter;
    import org.jdom.input.SAXBuilder;  
    //XSL转化需要的?br /> 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.w3c.dom.Document DOMDoc;
   DOMOutputter DomOut = DOMOutputter();
   DOMDoc = DomOut.output(org.jdom.Document);//把jdom的document转化成DOM的document

   TransformFactory transFactory = TransformFactory.newInstance();
   Transformer transformer = transFactory.newTransformer(new DOMSource(DOMDoc));//感觉错了Q应该是XSL文g?br />    Transformer.transform(new DOMSource(DOMDoc),new StreamResult(out));

//Ҏ以前的{化,是从文g到文Ӟ现在是DOM树到屏幕输出?br /> TransformerFactory transFactory = TransformerFactory.newInstance();

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

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

TonyZhangtl 2009-12-02 21:14 发表评论
]]>
xml解析http://www.aygfsteel.com/TonyZhangtl/archive/2009/12/02/304551.htmlTonyZhangtlTonyZhangtlWed, 02 Dec 2009 13:13:00 GMThttp://www.aygfsteel.com/TonyZhangtl/archive/2009/12/02/304551.htmlhttp://www.aygfsteel.com/TonyZhangtl/comments/304551.htmlhttp://www.aygfsteel.com/TonyZhangtl/archive/2009/12/02/304551.html#Feedback0http://www.aygfsteel.com/TonyZhangtl/comments/commentRss/304551.htmlhttp://www.aygfsteel.com/TonyZhangtl/services/trackbacks/304551.html dom优点Q整个文档树在内存中Q便于操作;支持删除、修攏V重新排列等多种功能Q缺点:整个文档调入内存(包括无用的节点)Q浪Ҏ间和I间Q用场合:一旦解析了文档q需多次讉Kq些数据Q硬件资源充I内存、CPUQ?
SAX Q事仉动。当解析器发现元素开始、元素结束、文本、文档的开始或l束{时Q发送事ӞE序员编写响应这些事件的代码Q保存数据。优点:不用事先调入整个 文档Q占用资源少QSAX解析器代码比DOM解析器代码小Q适于AppletQ下载。缺点:不是持久的;事gq后Q若没保存数据,那么数据׃了;无状? 性;从事件中只能得到文本Q但不知该文本属于哪个元素;使用场合QApplet;只需XML文档的少量内容,很少回头讉KQ机器内存少Q?br />

TonyZhangtl 2009-12-02 21:13 发表评论
]]>
单例模式http://www.aygfsteel.com/TonyZhangtl/archive/2009/11/30/304316.htmlTonyZhangtlTonyZhangtlMon, 30 Nov 2009 13:33:00 GMThttp://www.aygfsteel.com/TonyZhangtl/archive/2009/11/30/304316.htmlhttp://www.aygfsteel.com/TonyZhangtl/comments/304316.htmlhttp://www.aygfsteel.com/TonyZhangtl/archive/2009/11/30/304316.html#Feedback0http://www.aygfsteel.com/TonyZhangtl/comments/commentRss/304316.htmlhttp://www.aygfsteel.com/TonyZhangtl/services/trackbacks/304316.html

TonyZhangtl 2009-11-30 21:33 发表评论
]]>
վ֩ģ壺 | | ɽ| ӯ| | ӽ| | ̨| | | | пǰ| | ˮ| ƽ| | ͷ| | | | | ʯ| | | | ³| | º| տ| | | | | | | Ͼ| ɽ| ګ| ɽ| ۽| ͨ|