两篇非常好的关于xml的sax和dom的文档。

panq 2001-10-17 04:51:51
小可在学xml中发现两篇非常好的关于xml的sax和dom的文档。分别是
http://d23xapp2.cn.ibm.com/developerWorks/xml/x-saxapi/index.shtml
http://d23xapp2.cn.ibm.com/developerWorks/xml/x-dmj/index.shtml
在jdk1.4下,比起以前的开发容易多了。

jdk1.4的下载地址
http://java.sun.com/j2se/1.4/

...全文
329 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
longlong3 2002-01-17
  • 打赏
  • 举报
回复
thank you
netyao 2001-10-19
  • 打赏
  • 举报
回复
thank you
czb 2001-10-18
  • 打赏
  • 举报
回复
要是人人象panq()这样就好了。我知道panq()是高手,以后还请panq()多多帮助大家。
fdxjj 2001-10-18
  • 打赏
  • 举报
回复
3x!做人就应该这样!向小可学习!向小可致敬!
panq 2001-10-18
  • 打赏
  • 举报
回复
以上的两段代码,需要idm的xml4j,在jbuilder5中有,请点击project->project Properties->在required libraries 中添加xml4j.
panq 2001-10-18
  • 打赏
  • 举报
回复
再贴出两篇dom的例子程序,希望对大家有所帮助。

DOM 学习小结
任何 XML 应用的核心是一个 XML 解析器。要处理一个 XML 文档,您的应用将创建一个 parser 对象,将一个 XML document 传递给它,然后处理从 parser 对象返回的结果。
我们讨论了不同类型的 XML 解析器,以及您为何选取其一。我们用不同方式来对解析器分类:
· 验证或非验证解析器
· 支持 Document Object Model (DOM) 的解析器
· 支持 Simple API for XML (SAX) 的解析器
· 用特定语言编写的解析器 (Java, C++, Perl 等)
在我们的下一章节,我们将探讨 DOM 解析器和如何使用它们。
DOM 是一个操作文档结构的通用接口。它设计的一个目标是为一个 DOM 兼容解析器所编写的 Java 代码应该可以使用其它任意 DOM 兼容的解析器而不需要修改代码。(我们稍后将展示这个。)
正如我们前面所提的,一个 DOM 解析器将以树形式返回您整个文档的结构
DOM 接口
DOM 定义了多个 Java 接口。下列是常用的:
· Node: DOM 基本的数据类型。
· Element: 您将最主要处理的对象是 Element。
· Attr: 代表一个元素的属性。
· Text: 一个 Element 或 Attr 的实际内容。
· Document: 代表整个 XML 文档。一个 Document 对象通常也被称为一棵 DOM 树。
常用的 DOM 方法
当您使用 DOM 时,下列是您将常会使用的方法:
· Document.getDocumentElement()
返回文档的根(root)元素。
· Document. GetNodeType()
返回文档的元素的类型
· Node.getFirstChild() and Node.getLastChild()
返回给定 Node 的第一个子女。
· Node.getNextSibling() and Node.getPreviousSibling()
这些方法返回下一个或前一个给定 Node 的同胞。
· Node.getAttribute(attrName)
对给定的 Node,返回给定名称的属性。例如,如果您要获得名为 id 属性 的对象,可调用 getAttribute("id")。
我们的第一个 DOM 应用!
介绍了很多概念,让我们继续吧。我们的第一个应用简单地读入一个 XML 文档并将其内容输出到标准输出。
domOne.java
这是我们的第一个 DOM 应用。它解析一个 XML 文档并将其内容输出到标准输出。

/*
* (C) Copyright IBM Corp. 1999 All rights reserved.
*
* US Government Users Restricted Rights Use, duplication or
* disclosure restricted by GSA ADP Schedule Contract with IBM Corp.
*
* The program is provided "as is" without any warranty express or
* implied, including the warranty of non-infringement and the implied
* warranties of merchantibility and fitness for a particular purpose.
* IBM will not be liable for any damages suffered by you as a result
* of using the Program. In no event will IBM be liable for any
* special, indirect or consequential damages or lost profits even if
* IBM has been advised of the possibility of their occurrence. IBM
* will not be liable for any third party claims against you.
*/

import java.io.OutputStreamWriter;
import java.io.PrintWriter;
import java.io.UnsupportedEncodingException;

import org.w3c.dom.Attr;
import org.w3c.dom.Document;
import org.w3c.dom.NamedNodeMap;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
import com.ibm.xml.parsers.*;

/**
* domOne.java
* Illustrates how to go through a DOM tree.
*/

public class domOne
{
public void parseAndPrint(String uri)
{
Document doc = null;

try
{
DOMParser parser = new DOMParser();
parser.parse(uri);
doc = parser.getDocument();
}
catch (Exception e)
{
System.err.println("Sorry, an error occurred: " + e);
}

// We've parsed the document now, so let's print it.
if (doc != null)
printDOMTree(doc);
}

/** Prints the specified node, then prints all of its children. */
public void printDOMTree(Node node)
{
int type = node.getNodeType();
switch (type)
{
// print the document element
case Node.DOCUMENT_NODE:
{
System.out.println("<?xml version=\"1.0\" ?>");
printDOMTree(((Document)node).getDocumentElement());
break;
}

// print element with attributes
case Node.ELEMENT_NODE:
{
System.out.print("<");
System.out.print(node.getNodeName());
NamedNodeMap attrs = node.getAttributes();
for (int i = 0; i < attrs.getLength(); i++)
{
Node attr = attrs.item(i);
System.out.print(" " + attr.getNodeName() +
"=\"" + attr.getNodeValue() +
"\"");
}
System.out.println(">");

NodeList children = node.getChildNodes();
if (children != null)
{
int len = children.getLength();
for (int i = 0; i < len; i++)
printDOMTree(children.item(i));
}

break;
}

// handle entity reference nodes
case Node.ENTITY_REFERENCE_NODE:
{
System.out.print("&");
System.out.print(node.getNodeName());
System.out.print(";");
break;
}

// print cdata sections
case Node.CDATA_SECTION_NODE:
{
System.out.print("<![CDATA[");
System.out.print(node.getNodeValue());
System.out.print("]]>");
break;
}

// print text
case Node.TEXT_NODE:
{
System.out.print(node.getNodeValue());
break;
}

// print processing instruction
case Node.PROCESSING_INSTRUCTION_NODE:
{
System.out.print("<?");
System.out.print(node.getNodeName());
String data = node.getNodeValue();
{
System.out.print(" ");
System.out.print(data);
}
System.out.print("?>");
break;
}
}

if (type == Node.ELEMENT_NODE)
{
System.out.println();
System.out.print("</");
System.out.print(node.getNodeName());
System.out.print('>');
}
}

/** Main program entry point. */
public static void main(String argv[])
{
if (argv.length == 0)
{
System.out.println("Usage: java domOne uri");
System.out.println(" where uri is the URI of the XML document you want to print.");
System.out.println(" Sample: java domOne sonnet.xml");
System.exit(1);
}

domOne d1 = new domOne();
d1.parseAndPrint(argv[0]);
}
}
在一个命令行窗口,运行下面的命令:
java domOne sonnet.xml
这个命令将载入我们的应用然后让它解析 sonnet.xml 文件。如果一切运行正常,您将看到 XML 文档的内容被输出到标准输出。
注意:该程序需要ibm的xml4j来解析。请加入该包。
sonnet.xml文件:
<?xml version="1.0"?>
<!DOCTYPE sonnet SYSTEM "sonnet.dtd">
<sonnet type="Shakespearean">
<author>
<last-name>Shakespeare</last-name>
<first-name>William</first-name>
<nationality>British</nationality>
<year-of-birth>1564</year-of-birth>
<year-of-death>1616</year-of-death>
</author>
<title>Sonnet 130</title>
<lines>
<line>My mistress' eyes are nothing like the sun,</line>
<line>Coral is far more red than her lips red.</line>
<line>If snow be white, why then her breasts are dun,</line>
<line>If hairs be wires, black wires grow on her head.</line>
<line>I have seen roses damasked, red and white,</line>
<line>But no such roses see I in her cheeks.</line>
<line>And in some perfumes is there more delight</line>
<line>Than in the breath that from my mistress reeks.</line>
<line>I love to hear her speak, yet well I know</line>
<line>That music hath a far more pleasing sound.</line>
<line>I grant I never saw a goddess go,</line>
<line>My mistress when she walks, treads on the ground.</line>
<line>And yet, by Heaven, I think my love as rare</line>
<line>As any she belied with false compare.</line>
</lines>
</sonnet>
sonnet.dtd文件:
<!-- sonnet.dtd -->
<!-- sonnet is the root of the document -->
<!ELEMENT sonnet (author,title?,lines)>
<!-- the default sonnet type is "Shakespearean" -->
<!ATTLIST sonnet type (Shakespearean | Petrarchan)
"Shakespearean">

<!-- author contains information about the author -->
<!ELEMENT author (last-name,first-name,nationality,
year-of-birth?,year-of-death?)>

<!-- last-name, first-name, nationality, year-of-birth,
and year-of-death are all elements inside author. -->

<!ELEMENT last-name (#PCDATA)>
<!ELEMENT first-name (#PCDATA)>
<!ELEMENT nationality (#PCDATA)>
<!ELEMENT year-of-birth (#PCDATA)>
<!ELEMENT year-of-death (#PCDATA)>

<!-- The title of the sonnet -->
<!ELEMENT title (#PCDATA)>

<!-- The lines element contains the 14 lines of the
sonnet. -->
<!ELEMENT lines (line,line,line,line,
line,line,line,line,
line,line,line,line,
line,line)>

<!ELEMENT line (#PCDATA)>


domCounter.java
这段代码解析一个 XML 文档,然后遍历 DOM 树来采集有关该文档的数据。当数据采集后将其输出到标准输出。
/*
* (C) Copyright IBM Corp. 1999 All rights reserved.
*
* US Government Users Restricted Rights Use, duplication or
* disclosure restricted by GSA ADP Schedule Contract with IBM Corp.
*
* The program is provided "as is" without any warranty express or
* implied, including the warranty of non-infringement and the implied
* warranties of merchantibility and fitness for a particular purpose.
* IBM will not be liable for any damages suffered by you as a result
* of using the Program. In no event will IBM be liable for any
* special, indirect or consequential damages or lost profits even if
* IBM has been advised of the possibility of their occurrence. IBM
* will not be liable for any third party claims against you.
*/

import java.io.OutputStreamWriter;
import java.io.PrintWriter;
import java.io.UnsupportedEncodingException;

import org.w3c.dom.Document;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
import com.ibm.xml.parsers.DOMParser;

/**
* domCounter.java
* This code creates a DOM parser, parses a document, then
* prints statistics about the number and type of nodes
* found in the document.
*/

public class domCounter
{
int documentNodes = 0;
int elementNodes = 0;
int entityReferenceNodes = 0;
int cdataSections = 0;
int textNodes = 0;
int processingInstructions = 0;

public void parseAndCount(String uri)
{
Document doc = null;
try
{
DOMParser parser = new DOMParser();
parser.parse(uri);
doc = parser.getDocument();
}
catch (Exception e)
{
System.err.println("Sorry, an error occurred: " + e);
}

// We've parsed the document now, so let's scan the DOM tree and
// print the statistics.
if (doc != null)
{
scanDOMTree(doc);
System.out.println("Document Statistics for " + uri + ":");
System.out.println("====================================");
System.out.println("Document Nodes: " + documentNodes);
System.out.println("Element Nodes: " + elementNodes);
System.out.println("Entity Reference Nodes: " + entityReferenceNodes);
System.out.println("CDATA Sections: " + cdataSections);
System.out.println("Text Nodes: " + textNodes);
System.out.println("Processing Instructions: " + processingInstructions);
System.out.println(" ----------");
int totalNodes = documentNodes + elementNodes + entityReferenceNodes +
cdataSections + textNodes + processingInstructions;
System.out.println("Total: " + totalNodes + " Nodes");
}
}

/** Scans the DOM tree and counts the different types of nodes. */
public void scanDOMTree(Node node)
{
int type = node.getNodeType();
switch (type)
{
case Node.DOCUMENT_NODE:
documentNodes++;
scanDOMTree(((Document)node).getDocumentElement());
break;

case Node.ELEMENT_NODE:
elementNodes++;
NodeList children = node.getChildNodes();
if (children != null)
{
int len = children.getLength();
for (int i = 0; i < len; i++)
scanDOMTree(children.item(i));
}
break;

case Node.ENTITY_REFERENCE_NODE:
entityReferenceNodes++;
break;

case Node.CDATA_SECTION_NODE:
cdataSections++;
break;

case Node.TEXT_NODE:
textNodes++;
break;

case Node.PROCESSING_INSTRUCTION_NODE:
processingInstructions++;
break;
}
}

/** Main program entry point. */
public static void main(String argv[])
{
if (argv.length == 0)
{
System.out.println("Usage: java domCounter uri");
System.out.println(" where uri is the URI of your XML document.");
System.out.println(" Sample: java domCounter sonnet.xml");
System.exit(1);
}

domCounter dc = new domCounter();
dc.parseAndCount(argv[0]);
}
}
panq 2001-10-18
  • 打赏
  • 举报
回复
to:flyzhen(风与云) 
我也是正在学习中,大家共同提高吧。
flyzhen 2001-10-18
  • 打赏
  • 举报
回复
To fdxjj(尘土飞扬): 
你让大家"向小可学习",就是让大家向你学习.
"小可"跟"敝人"一样,是对自己的谦称.I 服了 You!

To panq():
我正在学习XML,能在这里看到这篇贴子,真是太好了!
谢谢
netyao 2001-10-18
  • 打赏
  • 举报
回复
小可是人家的谦称吧,我想
panq 2001-10-17
  • 打赏
  • 举报
回复
以后小可会把在学习中发现的好东东发出来,希望还能入大家的法眼。
panq 2001-10-17
  • 打赏
  • 举报
回复
还有一篇,小可觉得不错。

XML Schema 学习小结
作者:薛泾

为何需要XML Schema
在当今的IT行业中,XML被赋予了越来越多的职责和功能,例如,作为文本数据库存储数据,作为某一行业中数据交换的标准表示,等等。这些都需要相应的XML文件中对数据的描述,如数据类型、长度进行严格的定义,这样才能真正做到数据的安全性和行业统一标准并有通用的规则对其进行解析。

然而,XML在其产生的时候就被定义为高开放性,用文本方式浏览,用标签来定义的标记语言,鉴于XML的这些特点,就像HTML文件一样,XML文件本身无法对文件中的数据进行严格的定义。

为了解决以上的矛盾,XML Schema应运而生了,它是用来定义XML文件的文本结构,数据类型等XML文件描述规则的。

何为XML Schema
其实,XML Schema本身也是一个xml文件,所不同的是,Schema文件所描述的是对引用它的xml文件的element和attribute的具体类型的。作为一个Schema文件,其特殊的文件头格式为:


<?xml version="1.0"?> ------------------------------------------xml文件头

<Schema name="schema_sample_1" ------------------------ 名称(可省略)

xmlns="urn:schemas-microsoft-com:xml-data" --------- 引用微软Schema类型定义(可省略)

xmlns:dt="urn:schemas-microsoft-com:datatypes"> -----引用微软Schema数据类型定义(可省略)

<!--…………..- 〉 ---------------------------------------------- 具体文件内容

</Schema>


必须注意的是,在一个定义Schema的xml文件中,文件的root一定为<Schema>…</Schema>,

在文件的具体内容中,你可以添加你对某个xml结构、数据类型的定义,请看下例:


<?xml version="1.0"?>

<catalog>

<book>

<title>Presenting XML</title>

<author>Richard Light</author>

<pages>334</pages>

</book>

<book>

<title>XML</title>

<author>Jane Lee</author>

<pages>450</pages>

</book>

</catalog>


这是一个表示书目录的xml文件,对每一本书的介绍,我们都要有一些数据上的规定,如,“书名”、“作者名”和“页数”都应该是唯一的,“作者名”应该为字符串类型,而“页数”应该为整数类型的,对每本“book”来说,只能有所指定的三个元素。


为了能实现上述要求,我们定义了如下schema:


<?xml version="1.0"?>

<Schema>

<ElementType name="title" content="textOnly" model="closed" />

<ElementType name="author" content="textOnly" dt:type=”string” model="closed" />

<ElementType name="pages" content="textOnly" dt:type=”int” model="closed" />

<ElementType name="book" content="eltOnly" model="closed" order=”seq”>

<element type="title" />

<element type="author" />

<element type="pages" />

</ElementType>

</Schema>


在以下的文章中,将详细的描述内容中的具体意义。

ElementType
ElementType是schema中最基本的,它用来定义xml文件中元素的格式,数据类型等。

定义一个ElementType的基本格式为:


<ElementType

content="{empty | textOnly | eltOnly | mixed}"

dt:type="datatype"

model="{open | closed}"

name="idref"

order="{one | seq | many}" >

</ElementType>


content
Content用于描述元素中的内容类型。
empty
元素内容为空

textOnly
元素只包含文本类型的内容

eltOnly
元素只包含元素类型的内容

mixed
元素内容包含上述任何情况



<ElementType name="x" content="empty"/>

<ElementType name="x" content="textOnly"/>

<ElementType name="x" content="eltOnly">

<element type="y">

</ElementType>

<ElementType name="x" content="mixed">

<element type='q'>

<element type='r'>

</ElementType>


 

model
Model定义元素的内容是否要严格的遵守schema中的定义。
open
元素内容可添加未特殊定义过的元素,特征,文本等

closed
元素内容只能添加特殊定义过的元素,特征,文本等



<ElementType name="x" model="open"/>

<ElementType name="y" model="close"/>


name
定义该元素的名称
   
<ElementType name="x"></ElementType>

order
定义该元素子元素的排列顺序
one
只允许元素内容按一种方式排列

seq
允许元素内容按指定的方式排列

many
按任意方式排列



<ElementType name='z' order="one">

<element type="x">

<element type="y">

</ElementType>

<ElementType name="x" order="one">

<group order="seq">

<element type="x1">

<element type="y1">

</group>

<group order="seq">

<element type="x2">

<element type="y2">

</group>

</ElementType>

<ElementType name="x" content="eltOnly" order="many">

<element type='q'>

<element type='r'>

</ElementType>

特别注明,seq只元素内容可以按特殊列出的排列顺序中任选一种。


Dt:type
用于指定元素文本的数据类型
boolean
布尔型

char
字符型

date
日期型

Date time
日期时间型

Float
实型

Int
整型

Number
数字型

Time
时间型

Uri
Universal Resource Identifier,如"urn:schemas-microsoft-com:Office9"

Uuid
例如"333C7BC4-460F-11D0-BC04-0080C7055A83".

entity
xml补充类型

entities
xml补充类型

enumeration
xml补充类型

id
xml补充类型

idref
xml补充类型

idrefs
xml补充类型

nmtoken
xml补充类型

nmtokens
xml补充类型

notation
xml补充类型

string
字符串类型



<ElementType dt:type=”int”></Element>

上表中只列举了一部分常见数据类型,如果您想得到关于dt:type更详细的信息,请浏览MSDN。


除此之外,元素类型可以有另外一种方式,即引用一个已有的ElementType,请看下例:


<ElementType name="pages" content="textOnly" dt:type=”int” model="closed" />

<ElementType name="book" content="eltOnly" model="closed" order=”seq”>

<element type="pages" />

</ElementType>


在元素book的定义中,为其定义了一个子元素,子元素的类型引用元素pages的定义。

 

AttrributeType
Attribute也是xml的元素之一,用它可以表示Element中的某些特征,自然,我们也希望对attribute的数据结构和数据类型作定义。

定义AttributeType的基本格式为


<AttributeType

default="default-value"

dt:type="primitive-type"

dt:values="enumerated-values"

name="idref"

required="{yes | no}" >


default
设定attribute的默认值,必须注意的是,default的值也必须符合AttributeType中其他对数据结构的定义



Dt:type
用于指定Attribute的数据类型
boolean
布尔型

char
字符型

date
日期型

Date time
日期时间型

Float
实型

Int
整型

Number
数字型

Time
时间型

Uri
Universal Resource Identifier,如"urn:schemas-microsoft-com:Office9"

Uuid
例如"333C7BC4-460F-11D0-BC04-0080C7055A83".

entity
xml补充类型

entities
xml补充类型

enumeration
xml补充类型

id
xml补充类型

idref
xml补充类型

idrefs
xml补充类型

nmtoken
xml补充类型

nmtokens
xml补充类型

notation
xml补充类型

string
字符串类型



<AttributeType dt:type=”int”>

AttributeType的datatype类型与ElementType的datatype类型是相同的,上表中只列举了一部分常见数据类型,如果您想得到关于dt:type更详细的信息,请浏览MSDN。


Dt:values
当dt:type为enumeration型时,定义attribute的可能值列表,attribute的值将在这些值中选取



<AttributeType name="colors" dt:type="enumeration"

dt:values="red green blue">


 

name
定义attribute的名称



required
定义该attribute是否一定要包含在element中
yes
一定要包含

no
不一定要包含



AttributeType与ElementType一样,也可以引用已有的AttributeType定义:

 

description
description是一种注释,用于说明Schema的定义内容。


<ElementType name="Book">

<description>

This is how we describe the books we sell. Be sure to specify

the ageGroup!

</description>

<element type="ageGroup">

<default>ADULT</default>

</element>

</ElementType>

 

group Element
group用来按一定序列,将element组织成group

group的表达形式为

<group

maxOccurs="{1 | *}"

minOccurs="{0 | 1}"

order="{one | seq | many}" >


maxOccurs
定义该group出现的最多次数
1
只能调用一次

*
可以调用任意次



minOccurs
定义该group出现的最少次数
0
无要求

1
至少调用一次



order
定义该group中element的排列顺序
one
只允许元素内容按一种方式排列

seq
允许元素内容按指定的方式排列

many
按任意方式排列



 

<ElementType name="x" order="one">

<group order="seq">

<element type="x1">

<element type="y1">

</group>

<group order="seq">

<element type="x2">

<element type="y2">

</group>

</ElementType>

 

Extensibility
Xml Schema时刻扩展的,他们建立在一个开放的内容模式上,在Schema文档上可以任意的添加elemtnt和attribute,如下例,你可以利用其extensibility机制,对element “page”加以限制条件,由namespace “myEXT”扩展的tag,限制了书本的页数必须在50至100页之间。


<ElementType name="pages" xmlns:myExt="urn:myschema-extensions">

<datatype dt:type="int" />

<myExt:min>50</myExt:min>

<myExt:max>100</myExt:max>

</ElementType>

 

如何在XML文件中引用XML Schema
要在一个XML文件中引用一个Schema,只需在相应的element处注明,一般格式为:


<”elementname” xmlns=” x-schema:[the url of the schema file]” >


例如:


<book xmlns="x-schema:http://www.microsoft.com/xml/schema/book.xml">

<title>Presenting XML</title>

<author>Richard Light</author>

<pages>334</pages>

</book>

 

Schema 与 DTDs
在Schema之前,另有一种定义XML结构的方式,即DTDs,两者的区别在于:


1 XML Schemas是XML文档,而DTDs有自己的特殊语法,这样,你只需懂得XML的语法规则即可编写Schema,无需学习其他语法规则;xml文件与xml schema文件可以用相同的语法分析器来解析,而无须写两套分析器;xml schema有强大、易用的扩展功能。


2 XML Schema利用名域将文档中特殊的节点与schema说明相联系,一个xml文件可以有多个对应的schema,而用DTDs的话,一个xml文件只能由一个相对应的DTDs。


3 XML schemas内容模型是开放的,可以随意扩充,而DTDs将无法解析扩充的内容。


4 DTDs只能把内容类型定义为一个字符串。而XML schemas允许你把内容类型定义为整型、浮点型、数据型、布尔型或者许多其他的简单数据类型,而无须重定义。

 

实例分析
现在我们来分析一下第二节中所举的schema例子定义了什么:


<?xml version="1.0"?>

<Schema>

<ElementType name="title" content="textOnly" model="closed" />

<ElementType name="author" content="textOnly" dt:type=”string” model="closed" />

<ElementType name="pages" content="textOnly" dt:type=”int” model="closed" />

<ElementType name="book" content="eltOnly" model="closed" order=”seq”>

<element type="title" />

<element type="author" />

<element type="pages" />

</ElementType>

</Schema>


该schema文件定义了四种element type:

title:只能有文本内容

author:只能有文本内容,数据类型为字符串型

pages:只能有文本内容,数据类型为整型

book:只能包含子元素,并且子元素的排列顺序必须按照schema所规定的顺序

book元素包含分别用,title,author,pages所定义的三个子元素。

panq 2001-10-17
  • 打赏
  • 举报
回复
DOM文档操作和XML文件互相转换的java实现
郭洪锋 (ghf_email@sohu.com)
2001 年 8 月

简介:该文简要描述了DOM的概念和内部逻辑结构,给出了DOM文档操作和XML文件互相转换的java实现过程。
1. DOM简介
目前,W3C已于2000年11月13日推出了规范DOM level 2。文档对象模型(DOM)是HTML和XML文档的编程接口规范,它与平台和语言是无关的,因而可以用各种语言在各种平台上实现。该模型定义了THML和XML文件在内存中的逻辑结构(即为文档),提供了访问、存取THML和XML文件的方法。利用DOM规范,可以实现DOM 文档和XML之间的相互转换,遍历、操作相应DOM文档的内容。可以说,要自由的操纵XML文件,就要用到DOM规范。

2. DOM内部逻辑结构
DOM文档中的逻辑结构可以用节点树的形式进行表述。通过对XML文件的解析处理,XML文件中的元素便转化为DOM文档中的节点对象。DOM的文档节点有Document、Element、Comment、Type等等节点类型,其中每一个DOM文档必须有一个Document节点,并且为节点树的根节点。它可以有子节点,或者叶子节点如Text节点、Comment节点等。任何的格式良好的XML文件中的每一个元素均有DOM文档中的一个节点类型与之对应。利用DOM接口将XML文件转化成DOM文档后,我们就可以自由的处理XML文件了。

3. java中的DOM接口
DOM规范提供的API的规范,目前Sun公司推出的jdk1.4测试版中的java API遵循了 DOM level 2 Core推荐接口的语义说明,提供了相应的java语言的实现。

在org.xml.dom中,jkd1.4提供了Document、DocumentType、Node、NodeList、Element、Text等接口,这些接口均是访问DOM文档所必须的。我们可以利用这些接口创建、遍历、修改DOM文档。

在javax.xml.parsers中,jkd1.4提供的DoumentBuilder和DocumentBuilderFactory组合可以对XML文件进行解析,转换成DOM文档。

在javax.xml.transform.dom和javax.xml.transform.stream中,jdk1.4提供了DOMSource类和StreamSource类,可以用来将更新后的DOM文档写入生成的XML文件中。

4. 例程

4.1 将XML文件转化成DOM文档
这个过程是获得一个XML文件解析器,解析XML文件转化成DOM文档的过程。

Jdk1.4中,Document接口描述了对应于整个XML文件的文档树,提供了对文档数据的访问,是该步骤的目标。Document接口可以从类DocumentBuilder中获取,该类包含了从XML文档获得DOM文档实例的API。XML的解析器可以从类DocumentBuilderFactory中获取。在jdk1.4中,XML文件转化成DOM文档可以有如下代码实现:
//获得一个XML文件的解析器
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
//解析XML文件生成DOM文档的接口类,以便访问DOM。
DocumentBuilder builder = factory.newDocumentBuilder();
document = builder.parse( new File(FileName) );



4.2 遍历DOM文档
获得接口类document实例后,可以对DOM的文档树进行访问。要遍历DOM文档,首先要获得Root元素。然后获得Root元素的子节点列表。这里通过递归的方法实现遍历的目的。


//获得Root元素
Element element = document.getDocumentElement();
//获得Root元素的子节点列表
nodelist = element.getChildNodes();
//用递归方法实现DOM文档的遍历
GetElement(nodelist);
其中GetElement方法实现如下:
public void GetElement(NodeList nodelist){
Node cnode;
int i,len;
String str;

if(nodelist.getLength() == 0){
// 该节点没有子节点
return;
}
for(i=0;i 1)
System.out.println(" "+str+" "+len);
}
}
}

注意:上面的代码只是显示Node类型和Text类型的对象。它们的类型标识分别是1和3。

4.3 修改DOM文档
修改DOM文档的API在DOM level 2 Core规范中做了说明,jkd1.4中的org.xml.dom中实现了这些API。修改DOM文档操作主要集中在Document、Element、Node、Text等类中,这里给出的例子中是在解析出的DOM文档中增加一系列对象,对应与在XML文件中增加一条记录。
// 获得Root对象
Element root = document.getDocumentElement();
// 在DOM文档中增加一个Element节点
Element booktype = document.createElement("COMPUTES");
//将该节点转化成root对象的子节点
root.appendChild(cdrom);
//在DOM文档中增加一个Element节点
Element booktitle = document.createElement("Title");
//将该节点转化成booktype对象的子节点
booktype.appendChild(booktitle);
//在DOM文档中增加一个Text节点
Text bookname = document.createTextNode("understand Corba");
//将该节点转化成bookname对象的子节点
booktitle.appendChild(bookname);



4.4 将DOM文档转化成XML文件
// 获得将DOM文档转化为XML文件的转换器,在jdk1.4中,有类TransformerFactory
// 来实现,类Transformer实现转化API。
TransformerFactory tfactory = TransformerFactory.newInstance();
Transformer transformer = tfactory.newTransformer();
// 将DOM对象转化为DOMSource类对象,该对象表现为转化成别的表达形式的信息容器。
DOMSource source = new DOMSource(document);
// 获得一个StreamResult类对象,该对象是DOM文档转化成的其他形式的文档的容器,可以是XML文件,文本文件,HTML文件。这里为一个XML文件。
StreamResult result = new StreamResult(new File(“text.xml”));
// 调用API,将DOM文档转化成XML文件。
transformer.transform(source,result);




这里提供了该例程的完整程序,该例程在windows 2000中jdk1.4环境中运行通过。

以上给出了一个例子,读者可以从中了解到对DOM操作的思路。因为对DOM的操作均遵循了DOM规范,所以也适用于其它语言对DOM的处理。
epoch2000 2001-10-17
  • 打赏
  • 举报
回复
雷峰
JAVA开发人员必备是HTML格式的 JavaTM 2 Platform Standard Edition 6 API 规范 本文档是 Java 2 Platform Standard Edition 6.0 的 API 规范。 请参见: 描述 Java 2 Platform 软件包 java.applet 提供创建 applet 所必需的类和 applet 用来与其 applet 上下文通信的类。 java.awt 包含用于创建用户界面和绘制图形图像的所有类。 java.awt.color 提供用于颜色空间的类。 java.awt.datatransfer 提供在应用程序之间和在应用程序内部传输数据的接口和类。 java.awt.dnd Drag 和 Drop 是一种直接操作动作,在许多图形用户界面系统中都会遇到它,它提供了一种机制,能够在两个与 GUI 中显示元素逻辑相关的实体之间传输信息。 java.awt.event 提供处理由 AWT 组件所激发的各类事件的接口和类。 java.awt.font 提供与字体相关的类和接口。 java.awt.geom 提供用于在与二维几何形状相关的对象上定义和执行操作的 Java 2D 类。 java.awt.im 提供输入方法框架所需的类和接口。 java.awt.im.spi 提供启用可以与 Java 运行时环境一起使用的输入方法开发的接口。 java.awt.image 提供创建和修改图像的各种类。 java.awt.image.renderable 提供用于生成与呈现无关的图像的类和接口。 java.awt.print 为通用的打印 API 提供类和接口。 java.beans 包含与开发 beans 有关的类,即基于 JavaBeansTM 架构的组件。 java.beans.beancontext 提供与 bean 上下文有关的类和接口。 java.io 通过数据流、序列化和文件系统提供系统输入和输出。 java.lang 提供利用 Java 编程语言进行程序设计的基础类。 java.lang.annotation 为 Java 编程语言注释设施提供库支持。 java.lang.instrument 提供允许 Java 编程语言代理检测运行在 JVM 上的程序的服务。 java.lang.management 提供管理接口,用于监视和管理 Java 虚拟机以及 Java 虚拟机在其上运行的操作系统。 java.lang.ref 提供了引用对象类,支持在某种程度上与垃圾回收器之间的交互。 java.lang.reflect 提供类和接口,以获得关于类和对象的反射信息。 java.math 提供用于执行任意精度整数算法 (BigInteger) 和任意精度小数算法 (BigDecimal) 的类。 java.net 为实现网络应用程序提供类。 java.nio 定义作为数据容器的缓冲区,并提供其他 NIO 包的概述。 java.nio.channels 定义了各种通道,这些通道表示到能够执行 I/O 操作的实体(如文件和套接字)的连接;定义了用于多路复用的、非阻塞 I/O 操作的选择器。 java.nio.channels.spi 用于 java.nio.channels 包的服务提供者类。 java.nio.charset 定义用来在字节和 Unicode 字符之间转换的 charset、解码器和编码器。 java.nio.charset.spi java.nio.charset 包的服务提供者类。 java.rmi 提供 RMI 包。 java.rmi.activation 为 RMI 对象激活提供支持。 java.rmi.dgc 为 RMI 分布式垃圾回收提供了类和接口。 java.rmi.registry 提供 RMI 注册表的一个类和两个接口。 java.rmi.server 提供支持服务器端 RMI 的类和接口。 java.security 为安全框架提供类和接口。 java.security.acl 此包中的类和接口已经被 java.security 包中的类取代。 java.security.cert 提供用于解析和管理证书、证书撤消列表 (CRL) 和证书路径的类和接口。 java.security.interfaces 提供的接口用于生成 RSA Laboratory Technical Note PKCS#1 中定义的 RSA(Rivest、Shamir 和 Adleman AsymmetricCipher 算法)密钥,以及 NIST 的 FIPS-186 中定义的 DSA(数字签名算法)密钥。 java.security.spec 提供密钥规范和算法参数规范的类和接口。 java.sql 提供使用 JavaTM 编程语言访问并处理存储在数据源(通常是一个关系数据库)中的数据的 API。 java.text 提供以与自然语言无关的方式来处理文本、日期、数字和消息的类和接口。 java.text.spi java.text 包中类的服务提供者类。 java.util 包含 collection 框架、遗留的 collection 类、事件模型、日期和时间设施、国际化和各种实用工具类(字符串标记生成器、随机数生成器和位数组)。 java.util.concurrent 在并发编程中很常用的实用工具类。 java.util.concurrent.atomic 类的小工具包,支持在单个变量上解除锁的线程安全编程。 java.util.concurrent.locks 为锁和等待条件提供一个框架的接口和类,它不同于内置同步和监视器。 java.util.jar 提供读写 JAR (Java ARchive) 文件格式的类,该格式基于具有可选清单文件的标准 ZIP 文件格式。 java.util.logging 提供 JavaTM 2 平台核心日志工具的类和接口。 java.util.prefs 此包允许应用程序存储并获取用户和系统首选项和配置数据。 java.util.regex 用于匹配字符序列与正则表达式指定模式的类。 java.util.spi java.util 包中类的服务提供者类。 java.util.zip 提供用于读写标准 ZIP 和 GZIP 文件格式的类。 javax.accessibility 定义了用户界面组件与提供对这些组件进行访问的辅助技术之间的协定。 javax.crypto 为加密操作提供类和接口。 javax.crypto.interfaces 根据 RSA Laboratories' PKCS #3 的定义,提供 Diffie-Hellman 密钥接口。 javax.crypto.spec 为密钥规范和算法参数规范提供类和接口。 javax.imageio Java Image I/O API 的主要包。 javax.imageio.event Java Image I/O API 的一个包,用于在读取和写入图像期间处理事件的同步通知。 javax.imageio.metadata 用于处理读写元数据的 Java Image I/O API 的包。 javax.imageio.plugins.bmp 包含供内置 BMP 插件使用的公共类的包。 javax.imageio.plugins.jpeg 支持内置 JPEG 插件的类。 javax.imageio.spi 包含用于 reader、writer、transcoder 和流的插件接口以及一个运行时注册表的 Java Image I/O API 包。 javax.imageio.stream Java Image I/O API 的一个包,用来处理从文件和流中产生的低级别 I/O。 javax.management 提供 Java Management Extensions 的核心类。 javax.management.loading 提供实现高级动态加载的类。 javax.management.modelmbean 提供了 ModelMBean 类的定义。 javax.management.monitor 提供 monitor 类的定义。 javax.management.openmbean 提供开放数据类型和 Open MBean 描述符类。 javax.management.relation 提供 Relation Service 的定义。 javax.management.remote 对 JMX MBean 服务器进行远程访问使用的接口。 javax.management.remote.rmi RMI 连接器是供 JMX Remote API 使用的一种连接器,后者使用 RMI 将客户端请求传输到远程 MBean 服务器。 javax.management.timer 提供对 Timer MBean(计时器 MBean)的定义。 javax.naming 为访问命名服务提供类和接口。 javax.naming.directory 扩展 javax.naming 包以提供访问目录服务的功能。 javax.naming.event 在访问命名和目录服务时提供对事件通知的支持。 javax.naming.ldap 提供对 LDAPv3 扩展操作和控件的支持。 javax.naming.spi 提供一些方法来动态地插入对通过 javax.naming 和相关包访问命名和目录服务的支持。 javax.net 提供用于网络应用程序的类。 javax.net.ssl 提供用于安全套接字包的类。 javax.print 为 JavaTM Print Service API 提供了主要类和接口。 javax.print.attribute 提供了描述 JavaTM Print Service 属性的类型以及如何分类这些属性的类和接口。 javax.print.attribute.standard 包 javax.print.attribute.standard 包括特定打印属性的类。 javax.print.event 包 javax.print.event 包含事件类和侦听器接口。 javax.rmi 包含 RMI-IIOP 的用户 API。 javax.rmi.CORBA 包含用于 RMI-IIOP 的可移植性 API。 javax.rmi.ssl 通过安全套接字层 (SSL) 或传输层安全 (TLS) 协议提供 RMIClientSocketFactory 和 RMIServerSocketFactory 的实现。 javax.security.auth 此包提供用于进行验证和授权的框架。 javax.security.auth.callback 此包提供与应用程序进行交互所必需的类,以便检索信息(例如,包括用户名和密码的验证数据)或显示信息(例如,错误和警告消息)。 javax.security.auth.kerberos 此包包含与 Kerberos 网络验证协议相关的实用工具类。 javax.security.auth.login 此包提供可插入的验证框架。 javax.security.auth.spi 此包提供用于实现可插入验证模块的接口。 javax.security.auth.x500 此包包含应该用来在 Subject 中存储 X500 Principal 和 X500 Private Crendentials 的类。 javax.security.cert 为公钥证书提供类。 javax.security.sasl 包含用于支持 SASL 的类和接口。 javax.sound.midi 提供用于 MIDI(音乐乐器数字接口)数据的 I/O、序列化和合成的接口和类。 javax.sound.midi.spi 在提供新的 MIDI 设备、MIDI 文件 reader 和 writer、或音库 reader 时提供服务提供者要实现的接口。 javax.sound.sampled 提供用于捕获、处理和回放取样的音频数据的接口和类。 javax.sound.sampled.spi 在提供新音频设备、声音文件 reader 和 writer,或音频格式转换器时,提供将为其创建子类的服务提供者的抽象类。 javax.sql 为通过 JavaTM 编程语言进行服务器端数据源访问和处理提供 API。 javax.sql.rowset JDBC RowSet 实现的标准接口和基类。 javax.sql.rowset.serial 提供实用工具类,允许 SQL 类型与 Java 编程语言数据类型之间的可序列化映射关系。 javax.sql.rowset.spi 第三方供应商在其同步提供者的实现中必须使用的标准类和接口。 javax.swing 提供一组“轻量级”(全部是 Java 语言)组件,尽量让这些组件在所有平台上的工作方式都相同。 javax.swing.border 提供围绕 Swing 组件绘制特殊边框的类和接口。 javax.swing.colorchooser 包含供 JColorChooser 组件使用的类和接口。 javax.swing.event 供 Swing 组件触发的事件使用。 javax.swing.filechooser 包含 JFileChooser 组件使用的类和接口。 javax.swing.plaf 提供一个接口和许多抽象类,Swing 用它们来提供自己的可插入外观功能。 javax.swing.plaf.basic 提供了根据基本外观构建的用户界面对象。 javax.swing.plaf.metal 提供根据 Java 外观(曾经代称为 Metal)构建的用户界面对象,Java 外观是默认外观。 javax.swing.plaf.multi 提供了组合两个或多个外观的用户界面对象。 javax.swing.plaf.synth Synth 是一个可更换皮肤 (skinnable) 的外观,在其中可委托所有绘制。 javax.swing.table 提供用于处理 javax.swing.JTable 的类和接口。 javax.swing.text 提供类 HTMLEditorKit 和创建 HTML 文本编辑器的支持类。 javax.swing.text.html 提供类 HTMLEditorKit 和创建 HTML 文本编辑器的支持类。 javax.swing.text.html.parser 提供默认的 HTML 解析器以及支持类。 javax.swing.text.rtf 提供一个类 (RTFEditorKit),用于创建富文本格式(Rich-Text-Format)的文本编辑器。 javax.swing.tree 提供处理 javax.swing.JTree 的类和接口。 javax.swing.undo 允许开发人员为应用程序(例如文本编辑器)中的撤消/恢复提供支持。 javax.transaction 包含解组期间通过 ORB 机制抛出的三个异常。 javax.transaction.xa 提供定义事务管理器和资源管理器之间的协定的 API,它允许事务管理器添加或删除 JTA 事务中的资源对象(由资源管理器驱动程序提供)。 javax.xml 根据 XML 规范定义核心 XML 常量和功能。 javax.xml.bind 为包含解组、编组和验证功能的客户端应用程序提供运行时绑定框架。 javax.xml.bind.annotation 定义将 Java 程序元素定制成 XML 模式映射的注释。 javax.xml.bind.annotation.adapters XmlAdapter 及其规范定义的子类允许任意 Java 类与 JAXB 一起使用。 javax.xml.bind.attachment 此包由基于 MIME 的包处理器实现,该处理器能够解释并创建基于 MIME 的包格式的已优化的二进制数据。 javax.xml.bind.helpers 仅由 JAXB 提供者用于: 提供某些 javax.xml.bind 接口的部分默认实现。 javax.xml.bind.util 有用的客户端实用工具类。 javax.xml.crypto 用于 XML 加密的通用类。 javax.xml.crypto.dom javax.xml.crypto 包的特定于 DOM 的类。 javax.xml.crypto.dsig 用于生成和验证 XML 数字签名的类。 javax.xml.crypto.dsig.dom javax.xml.crypto.dsig 包特定于 DOM 的类。 javax.xml.crypto.dsig.keyinfo 用来解析和处理 KeyInfo 元素和结构的类。 javax.xml.crypto.dsig.spec XML 数字签名的参数类。 javax.xml.datatype XML/Java 类型映射关系。 javax.xml.namespace XML 名称空间处理。 javax.xml.parsers 提供允许处理 XML 文档的类。 javax.xml.soap 提供用于创建和构建 SOAP 消息的 API。 javax.xml.stream javax.xml.stream.events javax.xml.stream.util javax.xml.transform 此包定义了用于处理转换指令,以及执行从源到结果的转换的一般 API。 javax.xml.transform.dom 此包实现特定于 DOM 的转换 API。 javax.xml.transform.sax 此包实现特定于 SAX2 的转换 API。 javax.xml.transform.stax 提供特定于 StAX 的转换 API。 javax.xml.transform.stream 此包实现特定于流和 URI 的转换 API。 javax.xml.validation 此包提供了用于 XML 文档验证的 API。 javax.xml.ws 此包包含核心 JAX-WS API。 javax.xml.ws.handler 该包定义用于消息处理程序的 API。 javax.xml.ws.handler.soap 该包定义用于 SOAP 消息处理程序的 API。 javax.xml.ws.http 该包定义特定于 HTTP 绑定的 API。 javax.xml.ws.soap 该包定义特定于 SOAP 绑定的 API。 javax.xml.ws.spi 该包定义用于 JAX-WS 2.0 的 SPI。 javax.xml.xpath 此包提供了用于 XPath 表达式的计算和访问计算环境的 object-model neutral API。 org.ietf.jgss 此包提供一个框架,该框架允许应用程序开发人员通过利用统一的 API 使用一些来自各种基础安全机制(如 Kerberos)的安全服务,如验证、数据完整性和和数据机密性。 org.omg.CORBA 提供 OMG CORBA API 到 JavaTM 编程语言的映射,包括 ORB 类,如果已实现该类,则程序员可以使用此类作为全功能对象请求代理(Object Request Broker,ORB)。 org.omg.CORBA_2_3 CORBA_2_3 包定义对 Java[tm] Standard Edition 6 中现有 CORBA 接口所进行的添加。 org.omg.CORBA_2_3.portable 提供输入和输出值类型的各种方法,并包含 org/omg/CORBA/portable 包的其他更新。 org.omg.CORBA.DynAnyPackage 提供与 DynAny 接口一起使用的异常(InvalidValue、Invalid、InvalidSeq 和 TypeMismatch)。 org.omg.CORBA.ORBPackage 提供由 ORB.resolve_initial_references 方法抛出的异常 InvalidName,以及由 ORB 类中的动态 Any 创建方法抛出的异常 InconsistentTypeCode。 org.omg.CORBA.portable 提供可移植性层,即可以使一个供应商生成的代码运行在另一个供应商 ORB 上的 ORB API 集合。 org.omg.CORBA.TypeCodePackage 提供用户定义的异常 BadKind 和 Bounds,它们将由 TypeCode 类中的方法抛出。 org.omg.CosNaming 为 Java IDL 提供命名服务。 org.omg.CosNaming.NamingContextExtPackage 此包包含以下在 org.omg.CosNaming.NamingContextExt 中使用的类: AddressHelper StringNameHelper URLStringHelper InvalidAddress 包规范 有关 Java[tm] Platform, Standard Edition 6 ORB 遵守的官方规范的受支持部分的明确列表,请参阅 Official Specifications for CORBA support in Java[tm] SE 6。 org.omg.CosNaming.NamingContextPackage 此包包含 org.omg.CosNaming 包的 Exception 类。 org.omg.Dynamic 此包包含 OMG Portable Interceptor 规范 http://cgi.omg.org/cgi-bin/doc?ptc/2000-08-06 的第 21.9 小节中指定的 Dynamic 模块。 org.omg.DynamicAny 提供一些类和接口使得在运行时能够遍历与 any 有关联的数据值,并提取数据值的基本成分。 org.omg.DynamicAny.DynAnyFactoryPackage 此包包含 DynamicAny 模块的 DynAnyFactory 接口中的类和异常,该模块在 OMG The Common Object Request Broker: Architecture and Specification http://cgi.omg.org/cgi-bin/doc?formal/99-10-07 的第 9.2.2 小节中指定。 org.omg.DynamicAny.DynAnyPackage 此包包含 DynAny 模块的 DynAnyFactory 接口中的类和异常,该模块在 OMG The Common Object Request Broker: Architecture and Specification http://cgi.omg.org/cgi-bin/doc?formal/99-10-07 的第 9.2 小节中指定。 org.omg.IOP 此包包含在 OMG 文档 The Common Object Request Broker: Architecture and Specification http://cgi.omg.org/cgi-bin/doc?formal/99-10-07 的 13.6.小节中指定的 IOP 模块。 org.omg.IOP.CodecFactoryPackage 此包包含 IOP::CodeFactory 接口中指定的异常(作为 Portable Interceptor 规范的一部分)。 org.omg.IOP.CodecPackage 此包根据 IOP::Codec IDL 接口定义生成。 org.omg.Messaging 此包包含 OMG Messaging Interceptor 规范 http://cgi.omg.org/cgi-bin/doc?formal/99-10-07 中指定的 Messaging 模块。 org.omg.PortableInterceptor 提供一个注册 ORB 钩子 (hook) 的机制,通过这些钩子 ORB 服务可以截取执行 ORB 的正常流。 org.omg.PortableInterceptor.ORBInitInfoPackage 此包包含 OMG Portable Interceptor 规范 http://cgi.omg.org/cgi-bin/doc?ptc/2000-08-06 的第 21.7.2 小节中指定的 PortableInterceptor 模块的 ORBInitInfo 本地接口中的异常和 typedef。 org.omg.PortableServer 提供一些类和接口,用来生成跨多个供应商 ORB 的可移植应用程序的服务器端。 org.omg.PortableServer.CurrentPackage 提供各种方法实现,这些实现能够访问调用方法的对象的身份。 org.omg.PortableServer.POAManagerPackage 封装 POA 关联的处理状态。 org.omg.PortableServer.POAPackage 允许程序员构造可在不同 ORB 产品间移植的对象实现。 org.omg.PortableServer.portable 提供一些类和接口,用来生成跨多个供应商 ORB 的可移植应用程序的服务器端。 org.omg.PortableServer.ServantLocatorPackage 提供定位 servant 的类和接口。 org.omg.SendingContext 为值类型的编组提供支持。 org.omg.stub.java.rmi 包含用于 java.rmi 包中出现的 Remote 类型的 RMI-IIOP Stub。 org.w3c.dom文档对象模型 (DOM) 提供接口,该模型是 Java API for XML Processing 的组件 API。 org.w3c.dom.bootstrap org.w3c.dom.events org.w3c.dom.ls org.xml.sax 此包提供了核心 SAX API。 org.xml.sax.ext 此包包含适合的 SAX 驱动程序不一定支持的 SAX2 设施的接口。 org.xml.sax.helpers 此包包含“帮助器”类,其中包括对引导基于 SAX 的应用程序的支持。
《疯狂XML讲义》主要以XML为核心,深入地介绍了XML的各种相关知识。《疯狂XML讲义》作为疯狂Java体系图书之一,依然保持该体系图书系统、全面的特点:不仅详细介绍了XML文档的各种知识,还通过案例示范了实际开发中如何应用XML知识。 《疯狂XML讲义》主要分为五个部分。第一部分介绍了XML、DTD、XML Schema等基础知识,这些知识主要教读者如何定义有效的XML文档,这部分内容是深入学习后面知识的基础,也是每个使用XML的开发者都应该掌握的基础。第二部分介绍了CSS、XSLT和XPath等知识,通过使用CSS或XSLT,可直接将XML文档当成视图技术。第三部分介绍了DOMSAX、JAXP、dom4j、JDOM、XQuery和XQJ等,其中的DOMSAX、JAXP、dom4i和JDOM都以结构化的方式来创建、解析XML文档,从而可以将XML文档作为数据传输工具,而XQuery则是一种新规范,通过X Query可以查询XML文档中的数据,就像使用SQL查询关系数据库的数据一样。第四部分介绍了Web Services和CXF,其中CXF是Java领域的主流Web Services框架,简单易用。第五部分则提供了两个综合性案例:基于XML的电子公告系统和电子拍卖系统,让读者将前面所学应用到实际项目中。尤其是电子拍卖系统,它是一个包含5个表,表之间具有复杂关联映射的系统,该案例采用目前最流行、最规范的轻量级Java EE架构,将整个应用分为领域对象层、DAO层和业务逻辑层,然后用CXF将业务逻辑组件包装成Web Services,从而可以将现有的Java EE项目与其他平台的、其他语言的异构项目进行整合,具有极好的指导价值和借鉴意义。 《疯狂XML讲义》大部分章节后都提供了相应的编程习题,供开发者巩固所学,将理论融入实际开发之用。关于这些编程习题的解题思路和参考答案可登录http://www.crazyit.org获取。 《疯狂XML讲义》是疯狂Java体系丛书之一,学习《疯狂XML讲义》无须任何XMI,基础,但DOMSAX、dora4i、JDOM解析部分包含了大量Java编程,因此建议先认真阅读疯狂Java体系的《疯狂Java讲义》一书。

67,518

社区成员

发帖
与我相关
我的任务
社区描述
J2EE只是Java企业应用。我们需要一个跨J2SE/WEB/EJB的微容器,保护我们的业务核心组件(中间件),以延续它的生命力,而不是依赖J2SE/J2EE版本。
社区管理员
  • Java EE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧