第6课
Entensible Markup Language (XML)

[<<返回] [目录] [下一个>>]

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)文件来描述你想让数据如何被处理。

  • 利用XSL样式,可以实现XML到HTML的映射。例如,我们可以定义一个XML标 题标签来表示一篇文章的标题,创建一个可以将XML标题标签映射到HTML H1标 题标签的XSL文件,从而显示给终端用户。
  • 一个DTD(也被称作是XML方案)包含了相应的规范,使其它程序可以使用 XML文件的样式,确保贴标签的数据是正确的格式。例如,一篇文章的DTD可能 会有一个标题标签,但是没有或有很多第一级和第二级抬头。

任何能够解析XML的程序都可以检查有格式的XML标签,同时,任何能够将XSL 样式或DTD规范应用到XML数据的程序都可以智能地处理标带标签的数据。例如, 如果一篇文章有两个标题标签,但DTD只允许一个,该程序就会返回一个错误。对 照DTD来检查XML文档的过程我们称之为验证(verification)。

XML的标方式与样式表和DTD是分开的。这就是说,你可以获得一个DTD文档和 一个至多个的样式表或DTD。不同的样式表可以让你根据文档被使用的方式设计不 同的显示方法。例如,一篇XML文章针对不同的网站有一个样式表,以便可以与各 个网站的风格统一。

J2EE当前的版本没有XSLT(可扩展样式表语言的转换)引擎,因此,像使用样 式表来将XML文档转换成HTML之类的操作在目前还不太现实。

修改JavaBean类

在本课中,一个genXML方法被添加到JBonusBean 类中,生成以下的的XML文件。我们将在讨论XML文档标签和结构之后对生成这个 文件的代码进行阐述。

<?xml version="1.0"?>
<report>
  <bonusCalc ssnum="777777777" bonusAmt="300.0" />
</report>

XML 序言

<?xml version="1.0"?>是XML 序言。XML文 件始终应该以一个标识该文件为XML文件的序言开头。这个序言并不是必不可少的, 也只能由人来读取,但它有很多好处。除了版本信息外,序言还可以包含编码和 独立的信息。

  • 编码信息: 表明用来对文件数据进行编码的字符集。未压 缩的Unicode显示为
    <?xml version="1.0" encoding="UTF-8"?>。 西欧和英语字符集表示为:
    <?xml version=“1.0” encoding=“ISO-8859-1”?>
  • 独立的信息: 表明这个文档是否使用了其它文件中的信息。 例如,一个XML文档可能会借助样式表来获得有关如何创建HTML用户界面或用于 有效标签规范DTD的信息。

文档根

<report>标签是这个文件中的第一个XML标 签。它是最高一级的XML标签,标明了文档数据的开始。这一级别标签的另一个名 称为根。XML标签有一个匹配的尾标签,在这个文档的结尾有对应的</report> 标签来关闭这个对。

你可以为XML标签指定任何名称。这个例子中使用了report, 因为这个XML文件是一个bonus报告。它也可以被命名为<root><begin>或别的什么。名称的含义取自样式表 和DTD,因为,正是在那里通过名称把规范分配给标签的。

子节点

<bonusCalc>标签表示bonus报告。这个标签 是一个加入到这个根的子节点。它使用属性来指定社会安全号码和bonus数量值 ( ssnumbonusAmt)。 你可以定义一个DTD来检查bonusCalc标签是否有ssnum 属性和bonusAmt属性,如果属性丢失或如位于不恰当 的地方,程序就会发生错误。

<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 -->
<bonusCalc ssnum="777777777" bonusAmt="300.0" />

处理指令(Processing Instruction)为处理XML数据的应用发送命令或信息。 处理指令的格式是<? target instructions?>, 其中的target是进行处理工作的应用的名称,指令 (instructions)包含了进行处理工作的应用的信息 或命令。序言(prolog)是处理指令的一个例子,其中xml 是目标,version="1.0"体现了指令内容。注意,目标 名称xml

<?xml version="1.0"?>

你也可以使用处理指令来区分代表不同内容的版本,如高级执行版和技术版。

JavaBean代码

本课中的JBonusBean类有一个import 语句,用来创建XML文档、处理错误、将文档写出到终端。为了简便,本课将XML 输出写出到终端。也可以将XML输出写入文件,但需要部署你的浏览器来使用Java 插件,并包含一个安全策略文件,授予用来向文件写操作的JavaBean代码权限。

本课中,要生成XML文件,需要导入ElementNodeXmlDocument类。还需要StringWriterIOException类来将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;

该版本的JBonusBean类还有不止一个的实例变量。 Session bean的远程接口,theCalculation,需要通 过getBonusAmtgenXML方 法被访问。这是由于genXML需要读取数据库,为存储 在数据库中的所有记录生成XML,因此必须要能够访问session bean的getRecord 方法。

Calc theCalculation;

在处理完成后,非空事件中的getBonusAmt方法对 JBonusBean.genXML方法进行调用。这个方法所做的第 一件事是创建一个XMLDocument对象和根节点,并将这 个根节点加入到文档中。根节点表示文档层次(或树)中的最高点,是处理开始 所在的点。

  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数值转换成一个信息串,创建一个子节点( bonusCalc), 并将社会安全号码和bonus值加入到CODE class=CODE>bonusCalc子节点中 作为属性。子节点代表文档层次或树的第二级,属性代表第三级。

    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();
    }

genXML方法的最后一部分创建一个StringWriter 对象,将文档层次/树写入StringWriter对象,将 StringWriter对象写到终端。

    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。可由genXML方法中的API 调用来创建DOM,你也可以让API 调用来访问DOM以进行诸如添加、删除和编辑子 节点,或对照DTD验证DOM等操作。还可以从XML文件中创建一个DOM。

 

图21 : 文档对象模型(DOM)

API

在安装J2EE时附带的j2ee.jar文件为分析和处理 XML数据提供了应用编程接口(API)。 目前,JAR文件可提供SAX,DOM和J2EE XML API。 你可以根据自己的需要选择最适合的API,正如 图22所示,XML文本独立于创建它的平台和语言。

 

图22 : 中立(Neutral)于平台 和语言的文本

SAX和DOM

SAX API是一个事件驱动的串行存取机制,处理过程是逐单元(element)地进 行的。

DOM API提供了一个相对常用的对象树状结构。你可以使用DOM API来控制它所 封装的应用对象层。DOM API是一个理想的交互式应用,因为,整个对象模型都存 在于内存中,可以被用户访问和操作。

创建DOM需要读取整个XML结构,将对象树存储在存储器中,这样造成了CPU和 内存的紧张。为此, SAX API更倾向于服务器端的应用和数据过滤器,它们都不 要求数据的内存中表示(inmemory representation)。

注: 可以登陆以下网址获得有 关DOM和SAX API的更多信息:
http://java.sun.com/xml/docs/tutorial/overview/3_apis.html

J2EE

独立于平台的J2EE XML API使用一个DOM树并提供一系列众多的操作DOM层次结 构的方法。J2EE XML API在com.sun数据包中,在本课的范例中使用。请注意,这 些API可能会被修改。

更新和运行应用

本课的主要内容就是修改JbonusBean类,你可以更新和重新部署该应用。

  • 本地应用窗口: 突出2BeansApp 应用。
  • 工具菜单: 选择“更新”,重新部署应用。
前一课的BonusApp 应用被自动卸载。

web 服务器的运行端口默认为8000。 若要打开bonus.jsp 页面,可进入以下网址, http://localhost:8000/JSPRoot/bonus.jsp ,这是 部署工具放置JSP页面的位置。

  • 填入社会安全号码和乘数。
  • 点击“提交”按钮。Bonus.jsp处理你的数据, 并返回一个带bonus计算值的HTML页面。

更多信息

通过搜索引擎可以在网上获得许多有关XML信息。一个有关XML的较好的网站是 www.xml.com。在java.sun.com 网站也有关于XML的说明,具体网址为, http://java.sun.com/xml/docs/tutorial/index.html

[TOP]

 

常见问答
下载中心
产品简介
 
 
Solaris论坛
 
   
 
null