使用JavaBeans处理XML,第1部分:互连JavaBeans来处理XML

2002-8-20 13:17:15【作者】 畅享网 【进入论坛】
广告

使用JavaBeans处理XML,第1部分:互连JavaBeans来处理XML

 

Mark Johnson

JavaWorld 专栏作家

1999 年 12 月

 有关 JavaBeans 的许多话题都集中在如何创建它们,而很少关心如何使用它们。本文(系列文章之一)将概述 IBM 的 XML Bean Suite,这是一个用来处理 XML 的 JavaBeans 组件工具箱。

"eating your own dog food" 这句话最近几年很流行。它的意思是将您每天销售的产品拿来自己用一用,以便从用户的角度来认识它。最近两年我一直在竭力办好有关 JavaBeans 的专栏(我的产品 (dog food) 专用商标),以向读者讲授如何创建新的 JavaBeans 以及如何以新颖的方式使用它们。但是我尚未集中讨论在应用程序中使用 JavaBeans -- 我还没有使用自己开发的产品 (eating my own dog food)。现在是甘心忍受自己的产品 (a big chunky bowl of dog food) 的时候了。

请记住,本月我将不讨论如何创建 JavaBeans,而是要说明如何使用 JavaBeans。在集成开发环境 (IDE) 中使用 JavaBeans 创建应用程序是学习如何思考组件的极好方法。被迫使用自己所提供的产品 (to chow down on what they's been dishing up) 的组件设计人员和实现人员很快就会知道什么使组件有用 -- 或无用。许多将 JavaBeans 组合到运行应用程序中的开发人员对 GUI 组件体会最深;因此,在本系列文章中,我尤其会注重完成数据处理而没有运行时用户界面的组件。

本讨论要使用的软件包是 IBM 的 XML Bean Suite,该套件可从 IBM 的 alphaBeans 网站免费下载(有关链接请参阅参考资料)。这个软件包与我以前讨论过的 XML JavaBeans 和 BML 有很大的不同。那些讨论所处理的问题是将 JavaBean 组件转换为 XML,或者从 XML 创建 JavaBeans。另一方面,XML Bean Suite 是设计用来处理 XML 数据的一个 JavaBean 组件集合。这个套件包含若干 JavaBeans,开发人员在 IDE 中可视化地将这些 JavaBeans 互连起来以读取、写入、显示和过滤 XML 数据。其中的许多 JavaBeans 没有运行时用户界面;它们在内部完成应用程序的大部分工作。它们也是将功能封装到一个组件中的极好的设计示例。

本文假定您熟悉 JavaBeans 和 XML 的基本概念。参考资料部分有到本文的背景资料的链接。

本月的专栏主要概述 XML Bean Suite,该套件包含大量用于处理 XML 的类。我将讨论 IDE 如何将 JavaBeans 互连起来以响应您的输入,在此过程中我也会指出有用的设计原则。随后的专栏将使用这些 XML bean 类来创建处理 XML 数据的应用程序(如 XML 文件编辑器)。

XML Bean Suite 的组成

alphaBeans 网站(请参阅参考资料)是 IBM 的 alphaWorks 网站的 JavaBeans 部分,该网站提供“早期接受的开发人员对 IBM 最新的 'alpha-code' 技术的直接访问”。这意味着代码可从该网站免费下载。某些代码甚至可免费用于商业用途,但许可限制随程序包的不同而不同。 alpha 标志也意味着软件还不能用于主时间。不保证 API 是稳定的,软件可能不定期地更新,IBM 也不保证会将 alphaWorks(和 alphaBeans)上的材料变为商业产品。尽管如此,原来在 alphaWorks 上启动的几个项目已成为完全的商业产品。大多数(如果不是全部) alphaWorks 技术都有在线论坛,用户可从中接受软件作者的建议,也可以提出改进产品的建议。

XML Bean Suite 是(39 个)Java 类的一个集合,可从 alphaBeans 网站免费下载。因为它是 alpha 软件,所以它还不能处理最新版本的 Swing(它要求 Swing 1.0.2),甚至不能处理最新版本的 IBM XML 处理器 xml4j(它要求版本 1.1.4)。下载时出现的许可协议授予代码的分发权利(但您不应该相信我的话 -- 请自己阅读许可证)。

套件中的 39 个类分为相关 JavaBeans 的 5 个集合。许多 bean 是非视件;即它们可能有设计时用户界面(如属性表),但没有运行时用户界面。表 1 列出了这 5 个 XML bean 集合。

Bean 集合 Bean 数 说明
XMLCoreBean 4 在文本和 DOM 表示之间转换 XML 并管理 DOM Node 的非视件 bean
XMLViewer 5 以各种方式显示 XML 文档或 DTD 的视件 bean
XMLEditor 12 允许由 DTD 管理的 XML 编辑器构造的非视件操作员 bean
XMLProcessing 5 提供对 XML 数据进行过滤、标记化、搜索和其他操作的非视件 bean
XMLConvenience 13 通过将 XMLEditor bean 和 java.awt GUI 对象组合在一起实现常用 XML 编辑子功能的 Bean

表 1. XML Bean Suite 中的 5 个 XML bean 集合

每个 bean 集合提供一个 XML 处理范围。您可以将这些集合中的 bean 的实例连接起来以创建 XML 应用程序。我们首先查看 XMLCoreBean 集合。

XMLCoreBean 集合

最基本的 XML bean 集合是 XMLCoreBean。这个 bean 集合允许您将 XML 本文转换为 XML 的文档对象模型 (DOM) 表示以及将 DOM 转换为 XML 文本。这些 XML bean 都是对 DOM 文档或文档的某些部分进行操作,所以它们充当 DOM 和 XML 之间的通道。其中最重要的是 XML 分析程序 DOMGenerator。

讨论 DOM 的生成

DOMGenerator bean 是 XML 分析程序的一种 JavaBean 封装,如图 1 所示。这个 bean 有三个属性:inputXmlFileLocation(字符串)、inputXmlText(字符串)和 inputXmlURLLocation(URL,可指定要分析的 XML 数据源)。一旦设置了任何这些属性,DOMGenerator 就会立即从 XML 源读取文本,并生成类型为 org.w3c.dom.Document 的结果,这是表示输入 XML 的 DOM 对象树的根。然后可将这个 Document 传递给接受 Document 输入的任何对象进行处理。

图 1. DOMGenerator 从 XML 输入生成一个 DOM 结果

DOMGenerator 还触发几个事件,以使任何感兴趣的监听程序知道分析是如何进行的。当开始分析、完成分析或出现错误时, DOMGenerator 都会触发一个 DOMGenerationEvent 事件。事件包含指明它属于哪种类型的一段代码。需要知道 DOMGenerator 完成什么任务的对象实现 DOMGenerationListener 接口,该接口有 generationStarted()、generationError() 和 generationOver() 方法。对象将自己作为监听程序注册到所感兴趣的 DOMGenerator 上,DOMGenerator 然后通过调用 DOMGenerationListener 接口的适当方法针对监听对象触发事件。

DOMGenerator 触发事件是什么意思?它触发事件为应用程序开发人员提供了什么好处?这两个问题的答案在对 IDE 如何将对象连接起来的解释中。

事件监听程序接口

现在正是讨论 IDE 如何互连对象的好时机。当您编写一个类时,通常希望当某个事件源触发一个事件时您的类的实例能得到通知。一个很好的示例是在 DOMGenerator 对象开始分析时变化的标签,我们稍后将创建这个标签。要捕获事件(因为您对触发事件的对象感兴趣),您可以编写一个实现该事件的 监听程序接口的类,然后调用事件源的 addEventtypeListener 方法将您的这个类的实例注册到事件源。

因此,系统中的某个对象(具体是哪个对象取决于您的 IDE)实现 DOMGenerationListener,然后调用 DOMGenerator.addDOMGenerationListener(this)。DOMGenerator 在开始分析之前调用该对象的 generationStarted() 方法,然后该对象设置标签的文本值以反映分析已经开始这一事实。

可视化的 IDE 允许您通过可视化地指明源对象和目标对象来设置这种监听程序接口,通常是在两个对象之间画一条线。一旦在 IDE 中指明有关事件类型、事件源和事件目标的信息,IDE 就会自动产生对 addEventtypeListener 的调用并生成监听程序接口的实现。

让我们查看一个在 IBM 的 VisualAge for Java 中使用 DOMGenerator 的速成示例。请注意,这些 XML bean 可以在任何符合 JavaBeans 的 IDE 中工作,而不只是 VisualAge。任何名符其实的 IDE 都允许用户以图形方式创建事件连接。对于不同的 IDE,图形外观可能有所不同,但基本思想是相同的。

图 2 显示了一个很小的应用程序,它使用 DOMGenerator 类分析 XML 文件。该图是直接从 IDE 拍摄的屏幕快照(为了便于以后讨论而添加的字母 A 到 D 除外)。

 图 2. 在 IDE 中连接 DOMGenerator 以创建应用程序

我在此应用程序中创建了四个用四个大写字母标识的事件连接,对应于下面列出的四个字母:

A:当文本框产生一个 actionEvent 事件(调用 actionPerformed())时,DOMGenerator 的属性 inputXmlFileLocation 被设置为该文本框中的字符串。

B:当 DOMGenerator 触发 DOMGenerationEvent 事件表明分析已开始时,文本标签的值被设置为 Started parsing...

C:当 DOMGenerator 触发 DOMGenerationEvent 事件表明分析已完成时,文本标签的值被设置为 Parsing complete.

D:如果 DOMGenerator 触发 DOMGenerationEvent 事件表明发生错误时,文本标签的值被设置为 Parse Error!

这意味着当用户在文本框中键入文件名并击 Return 键时,DOMGenerator 获得一个文件名作为它的输入,并自动启动分析。DOMGenerator 触发一个事件表明它正在开始分析,然后分析文件,最后发出一个事件表明分析成功完成,或发出一个错误条件。在任一种情况下,您都会看到标签随着分析过程变化。如果 DOMGenerator 分析成功,则它使创建的 Document 对象可通过其 result 属性访问。

但是画几条线如何会使事件连接起来呢?我所画的线表明源(引出线的对象)和 目标(线到达的对象)之间的事件监听程序关系。作为一个简单的示例,让我们查看情况 B。在我的 IDE 中,我将 DOMGenerator 连接到 Label,方法是选中 DOMGenerator 的 generationStarted 事件(在弹出菜单上)并将它连接到 Label 上以设置标签的 text 属性。我通过编辑关系(元件之间的线)自身的属性,输入 Started Parsing... 字符串作为标签文本的值。

当我绘制这个关系时,IDE 完成了两项操作。首先,它选择了一个要成为 DOMGenerationListener 的对象。VisualAge for Java 使应用程序类(称为 AWTDOMGeneratorDemo)成为监听程序,然后实现监听程序方法。因此,IDE 在类定义中添加一个新的 implements 子句,如下所示:

public class AWTDOMGeneratorDemo
   extends Frame
   implements com.ibm.xml.generator.event.?
   DOMGenerationListener,; WindowListener, ...

然后,它实现该监听程序接口的方法,其中的一个方法是 generationStarted():

/**
 * Method to handle events for the DOMGenerationListener?
   interface.
 * @param arg1 com.ibm.xml.generator.event.DOMGenerationEvent
 */
/* WARNING: THIS METHOD WILL BE REGENERATED. */
public void generationStarted?
(com.ibm.xml.generator.event.DOMGenerationEvent arg1) {
    // user code begin {1}
    // user code end
    if ((arg1.getSource() == getDOMGenerator1()) ) {
        connEtoM2(arg1);<
    }
    // user code begin {2}
    // user code end
}

 用普通语言来讲,这个方法可翻译为,“当 DOMGenerator 调用 generationStarted() 时调用 connEtoM2() 方法”。后一个方法实际上是设置标签,如下面的清单所示。现在,只要 DOMGenerator 触发 generationStarted 事件,应用程序类就会将标签的 text 属性(标签显示的字符串)设置为 Started Parsing...。这是 IDE 在不修改源代码的情况下创建 JavaBeans 之间的关系的最常用方法。

/**
 * connEtoM2:  (DOMGenerator1.domGeneration.generationStarted(
 * com.ibm.xml.generator.event.DOMGenerationEvent) --> ?
  Label2.text)
 * @param arg1 com.ibm.xml.generator.event.DOMGenerationEvent
 */
/* WARNING: THIS METHOD WILL BE REGENERATED. */
private void connEtoM2?
 (com.ibm.xml.generator.event.DOMGenerationEvent arg1) {
    try {
        // user code begin {1}
        // user code end
        getLabel2().setText("Started parsing...");
        // user code begin {2}
        // user code end
    } catch (java.lang.Throwable ivjExc) {
        // user code begin {3}
        // user code end
        handleException(ivjExc);
    }
}

事件监听程序接口是在构造对象时调用的 init 方法中设置的。

您的 IDE 可能以不同的方式完成这些工作。请记住,我在前面说某个对象必须能够响应输入事件;在 VisualAge 中,那个对象就是应用程序类本身。其他 IDE 可能生成很小的适配器类,这些类的唯一目标就是监听某个对象(源)的消息,并在事件到达时调用另一个对象(目标)的某个方法(或设置一个属性,或其他操作)。还有一些 IDE 创建单个多路适配器来监听应用程序中的所有事件并分派所有结果调用。与 VisualAge 所使用的 "if-then-else" 方法相比,处理事件监听程序的适配器方法是将对象连接在一起的一种更具有面向对象特征的解决方案。

您可以自己运行一下这个小应用程序;您可以在本文结尾的参考资料部分下载它。源代码档案文件中包含一个小 XML 文件,example.xml,在本文中我始终将它用作测试输入。

此应用程序吸引人的一个地方是我创建它时没有写一行代码。我进行的全部操作就是放置一些 JavaBean 类的实例,然后通过连接事件关系将这些实例连接在一起。我选择属性并画线,IDE 编写实例化 JavaBeans 并将它们粘合在一起的代码。用同样的方法可以创建更复杂(并有实际用途)的应用程序。

现在您已经获得了 bean 之间如何通信的一些背景知识,让我们回到 XMLCoreBean 集合并查看它提供哪些别的工具。

XMLFileGenerator 和 XMLStringGenerator
XMLFileGenerator 和 XMLStringGenerator bean 执行 DOMGenerator 的逆向操作。DOMGenerator 分析 XML 数据并生成 DOM 树,而 XMLFileGenerator 将 DOM 树编码为 XML 文件,XMLStringGenerator 将 DOM 树编码为一个 String。图 3 是这两个类所进行的操作的示意图。

 图 3. XMLFileGenerator 和 XMLStringGenerator 将 DOM 转换为 XML

可以通过设置对象的 inputDocument 属性为 XMLFileGenerator 或 XMLStringGenerator 提供输入,该属性的类型为 org.w3c.Document,而 org.w3c.Document 是要转换为 XML 的 DOM 树的根。设置该属性使对象立即将 DOM 树转换为 XML 并将此 XML 写入它的输出。XMLFileGenerator 将其输出写入一个文件,该文件的文件名是 XMLFileGenerator 的 xmlSaveLocation 属性的值。XMLStringGenerator 有一个称为 result 的字符串属性,该属性包含最近一次转换的 DOM 文档的 XML 表示。

图 4 显示了一个速成应用程序样例,XMLStringGeneratorDemo,它示范了活动中的 XMLStringGenerator。同样,图中的大写字母并不出现在 IDE 中;我添加它们只是为了便于讨论。

 图 4. XMLStringGeneratorDemo 示范了 XMLStringGenerator

XMLFileGeneratorDemo 示范 (demonstration) 应用程序扩展了我们以前的演示 (demo) 应用程序。我在应用程序中添加了一个(非视件)XMLFileGenerator,并在窗口中添加了一个 TextArea 来接收 XMLFileGenerator 生成的字符串结果。应用程序事件流通常类似以下过程:

A:用户输入一个文件名并击 Return 键,这样就触发一个 actionEvent 事件。这个事件设置 DOMGenerator 的输入 inputXmlFileLocation 属性。设置此属性导致 DOMGenerator 分析 XML 文件,DOMGenerator 将这个 XML 文件设置为它的 result 属性。

B:在完成分析并设置其 result 属性以后,DOMGenerator 设置 XMLStringGenerator 的 inputDocument 属性。XMLStringGenerator 然后将 DOM 转换为一个字符串,并将这个字符串设置为它的 result 属性。

C:XMLStringGenerator 的 result 属性与 TextArea 的 text 属性绑定在一起,从而使 TextArea 的内容成为来自 XMLStringGenerator 的 XML。
似乎如此多的工作只是为了将一个字符串放入一个 TextArea 中,但这个小应用程序样例只是为了说明概念。

前面我们所说明的全部三个 bean 有一些公共的属性和方法,您应该对它们所有了解。每个 bean 的 autoAction 属性都表明是否应该在其输入属性被设置以后立即开始处理。autoAction 在缺省情况下是 true;如果它是 false,则外部对象可以设置这个 bean 的输入属性,而且 bean 在其 triggerAction() 方法被调用之前不会生成任何输出。比如说,这将允许您为 DOMGenerator bean 输入一个文件名,而直到用户单击某个按钮才开始分析。按钮被单击时将调用 DOMGenerator 的 triggerAction() 方法,以启动分析进程。

XMLCoreBean 集合中的最后一个类,NodeArray,是一个非视件容器类,它包含一个 org.w3c.dom.Node 数组,DOM 子树中的每个节点都是该数组的一个子类。这个类是一个可向其发送消息的简单容器,这些消息指示容器在其自身中添加或删除节点。我将会在需要在一个应用程序样例中使用 NodeArray 时复习这个类。

现在,让我们对下月的栏目提前开个头:简单介绍一下 XML bean 集合,这些 bean 用来处理您刚学会对其进行装载的 DOM 结构。

XMLProcessing 集合

XMLProcessing bean 集合在 XML 文档被分析为 DOM 树以后控制对 XML 文档的处理。这五个 bean 非常灵活,而且功能强大。表 2 是这五个 bean 的名称以及对它们的简短说明。

Bean 说明
XMLSearch 给定表示 XML 文档的一个 DOM 结构以及表示查询的另一个 DOM 结构,这个 bean 将在输入结构中搜索与查询匹配的对象结构,并且每匹配一次就触发一个事件。
XMLFilter 给定表示 XML 文档的一个 DOM 结构和表示查询的另一个 DOM 结构,这个 bean 只允许与查询匹配的那些子结构通过。
XMLTokenizer 这个 bean 执行输入 DOM 树的一个中序遍历,并且每遇到一个节点就触发一个事件。事件类型基于所遇到的文档节点的类型。
ElementSelector 这个 bean 从 XMLTokenizer 中过滤事件,只允许与特定元素相对应的那些事件通过。
AttributeSelector 这个 bean 从 XMLTokenizer 中过滤事件,只允许与特定属性相对应的那些事件通过。

表 2. XMLProcessing bean 集合的五个 bean

本月的最后一个示例说明,如何遍历您刚才用 DOMGenerator 装载到内存中的 DOM 结构。

XMLTokenizer

遍历 XML 文件的一个更轻量(因此流行)的方法是使用 SAX 接口,该方法由 Megginson Technologies 公司的负责人 David Megginson 发明(本文结尾的参考资料部分有到 Megginson 网站的链接)。

SAX(用于 XML 的简单 API)是一种基于事件的文档遍历机制,许多 XML 分析程序(包括生成 DOM 结构的许多分析程序)在内部都是基于 SAX 的。

SAX 提供了分析 XML 的一个框架,当在分析过程中遇到特定的标记时,就回调程序员定义的 handler 方法。例如,当 SAX 分析程序在其输入中发现一个 XML 元素(比如说 <beer>)时,分析程序就调用程序员定义的处理程序 beginElement(),并将标记名 (beer) 作为传入参数。结果是 DOM 结构的一个中序遍历,程序员可巧妙地使用这个结果来处理整个文档,而 无须在内存中构建一个大型的 DOM 对象树。(有关 SAX 的详细信息,请参阅参考资料。)

XMLTokenizer bean 以与 SAX 遍历 XML 文档大致相同的方式遍历它的输入 DOM 结构。对于树中的每个 Node,它都会触发一个事件,事件的类型由所遇到的 Node 的类型决定。tokenizer 针对元素、属性、XML 处理指令、文本项、注释和特殊符号触发事件。可将这些事件发送给其他 bean 来指导输入 DOM 的处理。发送事件的次序与标记在原始 XML 数据中出现的次序始终相同。

名称 XMLTokenizer 易产生误导:它实际应该称为 DOMTraverser。XMLTokenizer 实际上不标记 XML -- 它遍历一个对象树。但是,因为 DOM 表示一个 XML 文档,而且因为结果与 XML 文档的 SAX 标记化十分相似,所以名称很重要 -- 从某种程度上说。XMLTokenizer 不接受字符串或文件名作为输入是一个遗憾,因为那样本质上将使 XML bean 能够使用 SAX XML 文档处理。

我为 XMLTokenizer 编写的示例仍然基于我针对 DOMGenerator 的第一个示例。尽管这样,现在当 DOMGenerator 分析完文档时,它会将 DOM 传递给一个 XMLTokenizer,XMLTokenizer 再用文档中的标记名填充一个 List 窗口小部件。图 5 是 XMLTokenizer Demo 的连接图,并带有熟悉(我希望)的用来标注连线的大写字母。

 图 5. XMLTokenizer 将它的所有标记压入一个列表中

这个简单的应用程序所进行的操作与前面的几个示例很相似。

A:DOMGenerator 分析输入框中所指定的文件,然后设置自己的 result 属性。

B:DOMGenerator 创建的 DOM 结构传递到 XMLTokenizer,XMLTokenizer 立即开始遍历 DOM 树。

C:当 XMLTokenizer 首次开始处理 DOM 树时,它触发 startOfDocument 事件,这个事件此处被连接到 List 的 removeAll() 方法。这意味着每当 XMLTokenizer 开始遍历一个文档时,列表将被清除。

D:对于输入中遇到的每个 org.w3c.dom.Element,XMLTokenizer 都会触发一个 elementStartTagFound 事件,该事件此处被连接到 List 的 addString() 事件上。XMLTokenizer 的 currentXMLToken 属性始终反映引起最后一个 elementStartTagFound 事件的元件的标记名。事件关系将 currentXMLToken 字符串传递给 List 的 addString() 事件。结果,每当 tokenizer 遍历 Element 时,Element 的标记名就被附加到列表的尾部。
使用本文代码样例中的 xml 文件样例 example.xml 运行这个应用程序的结果如图 6 所示。xml 文件的前几行如下所示:

<?xml version="1.0"?>

<Recipe>
   <Name>Lime Jello Marshmallow Cottage Cheese Surprise</Name>
   <Description>My grandma's favorite (may she rest in peace.)?
    </Description>
   <Ingredients>
      <Ingredient>
         <Qty unit="box">1</Qty>
      ...

请注意,图 6 的List 中的字符串次序与标记名在样例文件中出现的次序相同。

 图 6. 运行中的 XMLTokenizer

其他 XML bean

本月,您已学会了如何使用 alphaBeans 的 XML Beans Suite 中的 JavaBeans 着手建立 XML 处理应用程序。您已了解了 IDE 如何使用事件监听程序将 JavaBeans 连接在一起,以及如何无须编写一行代码就能分析、编写和处理 XML 文档。

尽管此处说明的应用程序都是很基础的,但下一个月的栏目中的示例会越来越复杂,功能也会越来越强大。下一个月我将分析 XMLProcessing bean 集合中其余的类,并开始介绍如何使用 XMLEditor bean 集合编辑 XML 文档。

参考资料

下载本文的源代码

jar 格式(包括类文件):http://www.javaworld.com/jw-11-1999/beans/JWBeansNov99.jar

用 gzip 压缩的 tar 格式: http://www.javaworld.com/jw-11-1999/beans/JWBeansNov99.tar.gz

zip 格式:http://www.javaworld.com/jw-11-1999/beans/JWBeansNov99.zip

代码使用指导:http://www.javaworld.com/jw-11-1999/beans/Addendum.html

XML 和 XML JavaBeans Suite 的参考资料

要获得有关 XML 的易读的快速入门文章,请试着阅读我的 1998 年 4 月的 JavaWorld 专题文章,"XML for the absolute beginner": http://www.javaworld.com/javaworld/jw-04-1999/jw-04-xml.html

我的 1997 年 10 月的 JavaWorld 文章,"Keep listening for upcoming events",是事件监听程序接口概念的一篇入门教程:http://www.javaworld.com/jw-10-1997/jw-10-beans.html

在我 1997 年 9 月写的一篇有关定制的文章中也有一个事件监听程序的示例,文章名为 "'Double Shot, Half Decaf, Skinny Latte' -- Customize your Java":http://www.javaworld.com/jw-09-1997/jw-09-beans.html

要从 alphaWorks alphaBeans 网站下载 IBM 的 XML JavaBeans Suite,请进入该网站并单击最左侧框架中列表底部的 XML Beans 链接:http://www.alphaworks.ibm.com/alphabeans

IBM 的 alphaBeans 网站有大量高质量的 JavaBeans 供您使用:http://www.alphaWorks.ibm.com/alphaBeans

IBM 的 xml4j 程序包中的分析程序可免费用于非商业用途。它甚至可免费用于商业用途,但一定要首先阅读许可协议:http://www.alphaWorks.ibm.com/formula/XML

万维网联盟 (W3C) 维护着介绍 XML 团体正在进行的工作的一个网页:http://www.w3.org/XML

Robin Cover 的 SGML/XML 网页是所有 XML 新闻网站的无可争议的母站点:http://www.oasis-open.org/cover/

一个很好的有关 XML 新闻、教程和信息的网站:http://www.xml.com

David Megginson,SAX 分析程序的作者,有一个网站:http://www.megginson.com

IBM 的 developerWorks 网站包括优秀的 XML 参考资料:http://www.ibm.com/developerWorks/xml

Microsoft 的数据管理越来越依赖于 XML。阅读有关 Microsoft 的 XML 战略:http://msdn.microsoft.com/xml/default.asp

作者简介

Mark Johnson 拥有 Purdue 大学计算机和电子工程学士学位 (1986),从 1997 年 8 月开始为 JavaWorld 撰稿。白天,他在 Fort Collins 公司的 OrganicNet 从事设计和开发。

如果您希望与本文章的作者或其所在机构,进一步交流,请联系:畅享网 姜小姐
jill.jiang@amteam.org | 021-51096826-112 | 在线联系
老孙的IT运维管理之道[原创]用户的BSM用户的IT业务管..

从企业实际的IT运营角度来看,BSM是推动IT与业务融合,实现、改善WCNG司IT管理和治理的最佳实践之一。

吕建伟 专栏和CIO问答软件项目实施管理

现实中很少能按照正规流程来的,所以只能把流程中的各个环节拆开,个个击破,以后就可以见招拆招了。

ITIL实施:CIO时刻准备着

千军易得,一将难求,要推进ITIL实施,CIO扮演的角色不容忽视。吹响集结号,CIO出击的时刻已经来到。

节能与优化IT 企业CIO过冬良策

当前金融危机的影响还在继续漫延,很多企业都在苦寻过冬的良策,在这种情况下,节能与优化技术与产品无疑成为CIO们关注的首要对象,本次选题就是针对节能与优化IT来为CIO们提供过冬的良……