|
|
第6课 XML(可扩展标记语言)是一种用来表示和描述基于文本数据的语言,目的是让 使用XML API的任何程序和工具都能够读取和处理这些数据。程序和工具能够生成 其它程序和工具可读取和处理的XML文件。 例如,一个公司可以使用XML生成报告,使接收该报告的各方能以最能满足他 们需要的方法来处理其中的数据。他们可以通过一个程序将XML数据转换成HTML, 从而将报告粘贴到网上,也可以利用一个工具来处理XML数据,创建一个市场演 示。根据不同的需要和一组独立于平台的程序和工具,使我们可以用各种不同的 方式来使用同样的数据。可以通过XML标签、文档类型定义(DTD), 也被称作 XML 模式和XML API来获得这些高效和经济的功能。 这一课将沿用第5课“将JavaBeans技术添加到Mix中”中的范例,使JavaBean类能够使用XML API打印一个用XML标签标 记的简单报告。 标记和处理文本
使用XML, 我们可以定义markup标签,来在一个文本文件中表示不同元素的数 据。例如,如果你的一个文本文件由一篇短文章组成,你可以定义XML标签来表示 标题、作者、第一级抬头、第二级抬头、列表、文章正文等等。如果是由XML标签 表示数据,你可以创建一个文档类型定义(DTD)和/或一个XSL(extensible style sheet)文件来描述你想让数据如何被处理。
任何能够解析XML的程序都可以检查有格式的XML标签,同时,任何能够将XSL 样式或DTD规范应用到XML数据的程序都可以智能地处理标带标签的数据。例如, 如果一篇文章有两个标题标签,但DTD只允许一个,该程序就会返回一个错误。对 照DTD来检查XML文档的过程我们称之为验证(verification)。 XML的标方式与样式表和DTD是分开的。这就是说,你可以获得一个DTD文档和 一个至多个的样式表或DTD。不同的样式表可以让你根据文档被使用的方式设计不 同的显示方法。例如,一篇XML文章针对不同的网站有一个样式表,以便可以与各 个网站的风格统一。 J2EE当前的版本没有XSLT(可扩展样式表语言的转换)引擎,因此,像使用样 式表来将XML文档转换成HTML之类的操作在目前还不太现实。 修改JavaBean类
在本课中,一个 <?xml version="1.0"?>
<report>
<bonusCalc ssnum="777777777" bonusAmt="300.0" />
</report>
XML 序言
文档根
你可以为XML标签指定任何名称。这个例子中使用了 子节点
<bonusCalc ssnum="777777777" bonusAmt="300.0" /> 其它XML标签
有很多种方法可用来标记数据。本例中使用了空标签,这是不包含数据的标签, 该标签使用属性来指定数据,并以斜线密封。可以创建本例的空标签,从而将数 据包含在XML标签中。XML分析程序检查所有被包含的数据都有合式(well-formed) 标签。合式标签由一个开始标签和一个结束标签组成,如下例所示。 空标签:
<bonusCalc ssnum="777777777" bonusAmt="300.0" />
合式标签:
<bonusCalc>
<ssnum>"777777777"</ssnum>
<bonusAmt>300.0</bonusAmt>
</bonusCalc>
XML注释标签看起来像HTML注释标签。 <!-- Bonus Report --> 处理指令(Processing Instruction)为处理XML数据的应用发送命令或信息。
处理指令的格式是
你也可以使用处理指令来区分代表不同内容的版本,如高级执行版和技术版。 JavaBean代码
本课中的 本课中,要生成XML文件,需要导入 import javax.naming.*;
import javax.rmi.PortableRemoteObject;
import Beans.*;
import java.io.StringWriter;
import java.io.IOException;
import com.sun.xml.tree.ElementNode;
import com.sun.xml.tree.XmlDocument;
该版本的 Calc theCalculation;
在处理完成后,非空事件中的 private void genXML(){
Bonus records = null;
//Create XML document
XmlDocument doc = new XmlDocument();
//Create node
ElementNode root = (ElementNode)
doc.createElement("report");
//Add node to XML document
doc.appendChild(root);
接下来的try和catch 块从数据库中获取记录,从记录中检索bonus数值和社会 安全号码,将bonus数值转换成一个信息串,创建一个子节点( try{
//Get database record
records = theCalculation.getRecord(socsec);
//Retrieve the social security number from record
String ssRetrieved = records.getSocSec();
//Retrieve bonus amount from record
double bRetrieved = records.getBonus();
//Convert double to string
Double bonusObj = new Double(bRetrieved);
String bString = bonusObj.toString();
//Create child node
ElementNode bonusCalc = (ElementNode)
doc.createElement("bonusCalc");
//Add attributes to child node
bonusCalc.setAttribute("ssnum", ssRetrieved);
bonusCalc.setAttribute("bonusAmt", bString);
//Add child node to root
root.appendChild(bonusCalc);
} catch (java.rmi.RemoteException e) {
e.printStackTrace();
}
try{
StringWriter out = new StringWriter();
doc.write(out);
System.out.println(out);
} catch (java.io.FileNotFoundException fe) {
System.out.println("Cannot write XML");
} catch (IOException ioe) {
System.out.println("cannot write XML");
}
XML文档的层次或树结构称为文档对象模型(DOM)。
图21是一个简化的DOM。可由
图21 : 文档对象模型(DOM)
API在安装J2EE时附带的
图22 : 中立(Neutral)于平台 和语言的文本
SAX和DOM
SAX API是一个事件驱动的串行存取机制,处理过程是逐单元(element)地进 行的。 DOM API提供了一个相对常用的对象树状结构。你可以使用DOM API来控制它所 封装的应用对象层。DOM API是一个理想的交互式应用,因为,整个对象模型都存 在于内存中,可以被用户访问和操作。 创建DOM需要读取整个XML结构,将对象树存储在存储器中,这样造成了CPU和 内存的紧张。为此, SAX API更倾向于服务器端的应用和数据过滤器,它们都不 要求数据的内存中表示(inmemory representation)。 注: 可以登陆以下网址获得有 关DOM和SAX API的更多信息: J2EE
独立于平台的J2EE XML API使用一个DOM树并提供一系列众多的操作DOM层次结 构的方法。J2EE XML API在com.sun数据包中,在本课的范例中使用。请注意,这 些API可能会被修改。 更新和运行应用
本课的主要内容就是修改JbonusBean类,你可以更新和重新部署该应用。
前一课的
web 服务器的运行端口默认为8000。 若要打开
更多信息通过搜索引擎可以在网上获得许多有关XML信息。一个有关XML的较好的网站是
[TOP] |
|
||||||||||||||||||||||||||||||||||||