<? xml version="1.0" encoding="GB2312"? > <PeopleInfo> <People PeopleId="YOUR"> <PeopleName> 古董 </PeopleName> <PeopleSex> 男 </PeopleSex> <PeopleAge> 23 </PeopleAge> </People> <People PeopleId="SHEN"> <PeopleName> 王冠 </PeopleName> <PeopleSex> 女 </PeopleSex> <PeopleAge> 25 </PeopleAge> </People> </PeopleInfo>
如果一个XML文档符合上述文档所表现出来的一些特征,即可称之为良构的XML文档。这些特征如下:
1. 每个元素必须有起始和结束标记;
2. 文档只有一个根元素;
3. 正确地对空元素进行格式化;
4. 开始和结束标注必须匹配(区分大小写);
5. 元素必须正确地嵌套;
6. 属性值必须用引号括起来。
IsXMLAvailable.java 是用于进行XML文档良构检验的Java程序,代码如下:
//IsXMLAvailable.java
import java.io.File;
import javax.xml.parsers.*;
import org.w3c.dom.*;
import org.xml.sax.*;
public class IsXMLAvailable{
public static void main(String argv[]){
if (argv.length!=1){
System.out.println("参数错误!");
System.exit(1);
}
try{
//取得工厂类的一个新实例
DocumentBuilderFactory dbf=
DocumentBuilderFactory.newInstance();
//通过静态方法创建DocumentBuilder 实例
//准备建立Document 对象
DocumentBuilder db=dbf.newDocumentBuilder();
//建立XML 文档对象
Document doc=db.parse(new File(argv[0]));
//格式化文档
doc.getDocumentElement().normalize();
System.out.println("XML 文件结构正确!");
}
catch(SAXParseException e){
//错误提示,SystemID 为全路径的文件名
System.out.println("XML 在第" +
e.getLineNumber()+"行出错异常,文件信息:"+e.getSystemId());
System.out.println("\n"+e.getMessage());
}
catch(SAXException ex){
ex.printStackTrace();
}
catch(Throwable th){
th.printStackTrace();
}
}
}
运行“java IsXMLAvailable People.xml”命令,如程序出错,则显示第几行有错,并给出可能的错误提示;如程序正确,则显示 “XML 文件结构正确!”
建立一个有效的XML 文档(DTD)及验证的实例
良好的XML 文档只说明了其语法正确,并没有解决语义问题。XML 描述了有一定含义的数据,其中可以指定包含数据的规则。通过这种指定的规则,可以验证已声明符合规则的XML 文档的有效性,即DTD——文档类型定义。
DTD 可以确保应用程序接收到一个有效的XML 文档,然后可以针对某一类XML 设计出应用程序接口。这样符合某种DTD 的XML 文档都可以被应用程序解析,也可以用DTD 制定自己的文档规则,而这个规则可被其它应用程序利用。DTD 有两种方法声明XML文件:
(1) 外部 DTD 声明如下:
<!DOCTYPE peopleinfo SYSTEM "People.dtd">
(2) 内部 DTD 声明(PeopleDTD.xml)如下:
<? xml version="1.0" encoding="GB2312"?>
<! DOCTYPE PeopleInfo[
<! ELEMENT PeopleInfo(People+)>
<!ELEMENT People(Peoplename, PeopleSex,PeopleAge)>
<! ELEMENT PeopleName(#PCDATA)>
<! ELEMENT PeopleSex(#PCDATA)>
<! ELEMENT PeopleAge(#PCDATA)>
<! ATTLIST People PeopleId CDATA #REQUIRED>
]>
<PeopleInfo>
<People PeopleId="YOUR">
<PeopleName> 古董 </PeopleName>
<PeopleSex> 男 </PeopleSex>
<PeopleAge> 23 </PeopleAge>
</People>
<People PeopleId="SHEN">
<PeopleName> 王冠 </PeopleName>
<PeopleSex> 女 </PeopleSex>
<PeopleAge> 25 </PeopleAge>
</People>
</PeopleInfo>
从上面的文件可以看到内嵌的DTD 在<! DOCTYPE> 标记中。首先声明的是XML 文档的根元素<PeopleInfo>,然后指明在<PeopleInfo>根元素中必须包含有一个或是多个的<People>元素(用People+ 表示)。下一句定义了在<People>元素中必须包含<PeopleName>、<PeopleSex>和<PeopleAge>3个元素。这3个元素的内容类型为#PCDATA,表示内容为文本类型。然后是对属性的定义,表示PeopleInfo 必须含有PeopleId 属性。#REQUIRED(必须含有)默认的可以省略,CDATA 表示属性值是字符串型。
要检验一个XML 文件是否有效需要在解析XML 文件时检验其是否有效。首先在创建DocumentBuilder 对象之前,利用语句设置有效性检验,语句如下:
dbf.setValidating(true);//设置对XML 文件进行有效验证
因为SAX 在解析XML 文件时,遇到不符合DTD规定的地方要触发相应的事件,所以还要在程序中定义实现了事件接口的类。在这里用的是常用的处理事件的静态内部类,在此类中必须实现的方法语句如下:
public void warning(SAXParseException spe) throws SAXExcepton
public void error(SAXParseException spe) throws SAXExcepton
public void fatalError(SAXParseException spe) throws SAXExcepton
不同级别的错误事件将分别触发这3个方法中的一个。
在IsXMLAvailableDTD.java 中,提供了对XML 文档进行有效性检验的源程序。从中可以看到SAX事件驱动的解析XML程序的编写方式http:。
运行“java IsXML AvailableDTD PeopleDTD.xml”命令,如果XML文件有效符合DTD的定义,程序则会提示“XML文件有效!”。
显示XML 数据的两种方法和XSLT
1.调用CSS 文件
(1) 编写一个hell.css 的样式单;
编写语句为“hello{display:block;font-size:48pt;font-weight:bold;font-style:italic;}”,其中的hello 是样式单的名称,随后定义的属性display、font-size、font-weight 和font-style 分别表示文字采用块(block)显示、文字的大小为48磅、文字是粗体、字体是斜体。
(2) 编写XML 文件。
在XML 文件中,如1.xml,加入一行代码为,1.xml 源程序代码如下:
<?xml version="1.0" standalone="yes"?>
<?xml-stylesheet type="text/css" href="hello.css"?>
<hello>
Hello,the world!
</hello>
2.调用XSL 文件
通过语句“<? xml-stylesheet type="text/xsl" href="2.xsl"?>”在XML 文件中调用2.xsl 文件。其中通过“type="text/xsl"”属性定义文件类型、“href="2.xsl"”属性用于定义引用文件的路径。语句格式如下:
<xsl:for-each select="hello">
<h1>
<xsl:value-of/>
</h1>
</xsl:for-each>
其中“<xsl:for-each select="hello">”用来选择"hello"元素,而“<xsl:value-of/>”是一个空标记,用来显示元素“<hello>”的内容。2.xml 文件的源代码如下:
<?xml version="1.0" standalone="yes"?>
<?xml-stylesheet type="text/xsl" href="2.xsl"?>
<hello>
Hello,the world!
</hello>
2.xsl 文件的源代码如下:
<?xml version="1.0" ?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/TR/WD-xsl">
<xsl:template match="/">
<html>
<body>
<xsl:for-each select="hello">
<h1>
<xsl:value-of/>
</h1>
</xsl:for-each>
</body>
</html>
</xsl:template>
</xsl:stylesheet>
3.XSLT
XSLT(XSL Transformations) 主要用于处理和输出XML 文档。处理功能指的是对XML 文档进行转换,对XML 文档中的元素进行提取、排序等操作。输出功能则是指用某种方式表现XML 文档。通过使用XSLT开发者可以描述一种从现有的XML 文档建立新的结构化文档的方法,而这种方法由XSLT引擎来实现。XSLT并不是一种编程语言。它的实现方法是给出实例,而不是描述执行过程。
XSLT是将模式(Pattern)与模板(Template)相结合实现的。模式与源树中的元素相匹配。模板被实例化产生部分结果树,结果树与源树是分离的,并且结果树的结构可以和源树截然不同。在结果树的构造中源树可以被过滤和重新排序,还可以增加任意的结构。
下面我们建立自己的XSLT,先将所需要用到的包加载到程序中。MyTransformer 的结构和DOM 及 SAX 很像,都有一个XXXFactory 和相对应的错误。除了基本的对象外MyTransformer 还需要加载DOMSource 和 StreamResult两个对象,分别作为Transformer 的输入和输出。
MyTransformer 的源代码如下:
//MyTransformer.java
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.FactoryConfigurationError;
import javax.xml.parsers.Parser ConfigurationException;
import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.TransformerException;
import javax.xml.transform.TransformerFactory ConfigurationError;
import javax.xml.transform.dom.DOMSource;
import javax.xml.transform.stream.StreamResult;
import java.io.File;
import org.w3c.dom.Document;
public class MyTransformer {
public static void main(String[] args) {
if(args.length != 1){
System.out.println("java MyTransformer [目的文件]");
return;
}
DocumentBuilderFactory domFactory =
DocumentBuilderFactory.newInstance();
domFactory.setNamespaceAware(true);
domFactory.setValidating(true);
try {
DocumentBuilder domParser = domFactory. newDocumentBuilder();
Document doc = domParser.parse(args[0]);
TransformerFactory factory =
TransformerFactory.newInstance();
Transformer transformer =
factory.newTransformer();
DOMSource source = new DOMSource(doc);
StreamResult target = new StreamResult(System.out);
transformer.transform(source, target);
}catch ( FactoryConfigurationError fce ) {
System.err.println("domFactory设置错误"
+ fce.getMessage() );
}catch ( ParserConfigurationException pce ) {
System.err.println("domBuilder设置错误"
+ pce.getMessage() );
}catch ( Exception e ) {
System.err.println("其他错误"
+ e.getMessage() );
e.printStackTrace();
}
}
}
XML 编程接口—DOM 和 SAX
1. DOM 编程
DOM 是一套为合法的Well-Formed 文件设计的API(应用程序接口),它同时定义了这些文件的逻辑结构、访问及操作方法。在DOM 的规范里,文件的定义很广泛,其中包括了HTML 和XML。所以,DOM 也可以用来操作XML 及 HTML 文件,也可以用DOM 建立文件、浏览文件结构以及增加或删除文件的某些内容。
DOM 由W3C 制定,目标是提供一个可以通用于各种程序语言、操作系统和应用程序的API,所以DOM 具有极高的兼容性,不论CORBA、COM、Java、C++等都可以使用同样的DOM 接口。也因为这种跨平台的需求,DOM 在定义时就采用了CORBA 标准,因此它可以为各个语言提供完全相同的接口。
DOM 是文档对象模型。XML 将数据组织为一棵树,DOM 就是对这棵树的一个对象描述。通俗地说,就是通过解析XML 文档,为XML 文档在逻辑上建立一个树模型,树的节点是一个个对象。我们通过存取这些对象就能够存取XML 文档的内容。
DOM 的基本对象有5个,分别是Document、Node、NodeList、Element 和 Attr。
下面举一个通过一个图形界面观察DOM 对象的例子。在Java 的标准包里有JTree 可以来表达树的概念,结合Java 的窗口JFrame ,完成一个类似于IE浏览器功能的DOM 对象查看器。
DOMTreeView.java 的源程序代码详见http://linux.ccidnet.com的期刊浏览第11期。
2.SAX 编程
SAX(Simple Application interface for XML)是一个为基于事件XML解析器定义的、可以免费获得的、与平台和语言无关的API,它允许程序和脚本动态的访问和更新文档内容、结构和风格。所以,它作为一个中间件层用来把XML文档中的数据解释成相应的Java事件。SAX这个接口规范是XML分析器和处理器提供的、较XML更底层的接口,它能提供应用以较大的灵活性。SAX是一种事件驱动的接口。它的基本原理是,由接口的用户提供符合定义的处理器,XML分析时遇到特定的事件,就去调用处理器中特定事件的处理函数。一般SAX都是Java的接口,但C++也可以用SAX接口,只是C++的分析器比较少。SAX需要用户提供以下三个处理器类的实现:
(1)DocumentHandlerXML:文件事件的处理器;
(2)DTDHandler:DTD中事件的处理器;
(3)ErrorHandler:出错处理器。
下面举一个例子,它实现了许多处理XML 文件时重要事件的ContentHandler 接口,并且说明SAX 是如何分析XML 数据的。
MySAXParser.java 的源程序代码如下(节选部分):
//MySAXParser.java
import java.io.IOException;
import java.io.FileInputStream;
import java.util.Properties;
import org.xml.sax.Attributes;
import org.xml.sax.ContentHandler;
import org.xml.sax.ErrorHandler;
import org.xml.sax.Locator;
import org.xml.sax.SAXException;
import org.xml.sax.SAXParseException;
import org.xml.sax.XMLReader;
import org.xml.sax.helpers.XMLReaderFactory;
/**
* <code>SAXParser</code>可以从命令行下读入一个XML文件并且使用SAX标准的机制来分析该文件。
*/
public class MySAXParser{
/**
*<p>
*我们将在这里使用标准的SAX的处理机制(handler)来处理XML文件
*</p>
* @param uri 欲分析的XML文件的URI
*/
public void parseXML(String uri) {
try{
System.out.println("正在分析中的XML文件: " + uri + "\n");
XMLReader parser =
XMLReaderFactory.createXMLReader(
"org.apache.xerces.parsers.SAXParser");
//XMLReader parser = new SAXParser();
//注册所设计的内容处理器
parser.setContentHandler(new MyContentHandler());
//注册错误处理器
parser.setErrorHandler(new MyErrorHandler());
//分析文件
parser.parse(uri);
} catch(IOException ioe){
System.out.println("文件读取错误:"+ioe.getMessage());
} catch(SAXException saxe){
System.out.println("XML分析错误: "+saxe.getMessage());
}
}
/**
*<p>
*主程序使用命令列的参数来指定所要分析的XML文件
*</p>
*/
public static void main(String[] args) {
//如果参数数目不对,则输出使用说明,并结束程序
if( args.length != 1 ){
System.out.println("请输入欲分析的文件名: " +"java example3_1 [XML URI]");
System.exit(-1);
}
String uri = args[0];
MySAXParser myParser = new MySAXParser();
myParser.parseXML(uri);
}
}
/**
*<code>ContentHandler</code>实做<code>org.xml.sax.
*ContentHandler</code>界面,并且提供提供相关的回调方法。
*所有和XML文件内容有关的分析处理都是在这里解决。
*/
class MyContentHandler implements ContentHandler {
..........
..........
Java 与 XML ——JAXP编程应用
在许多方面,Java 语言已变成供XML 选择的一种非常适合的编程语言。在JAXP(用于XML语法分析的Java API)中包含3个软件包:
1. org.w3c.dom —W3C 推荐的用于XML 标准规划文档对象模型的Java 工具;
2. org.xml.sax—用于对XML 进行语法分析的事件驱动的简单API;
3. Javax.xml.parsers —工厂化工具,允许应用程序开发人员获得并配置特殊的语法分析器工具。
JAXP 作为Java 应用软件和XML 的公共接口,用来保证Sun 、IBM 和 Micrsoft 等公司的XML 分析程序的完全兼容性。
JAXP 是由Sun 提供的Java 的标准XML 语言开发接口,目前最高版本为1.1 。JAXP1.1包含两个部分:一个是parser 部分,位于Javax.xml.parsers 包中,负责解析XML 文档;另一个是transform(TrAX)部分,位于Java.xml.transform 包中,负责进行xslt 转换工作。
JAXP1.1 中包含3个jar 文件,分别是JAXP.jar、crimson.jar 和 xalan.jar 。JAXP.jar 提供了一系列的界面和抽象类,是开发时使用的接口;crimson.jar 中定义了实际上使用的解析器;xalan.jar 中定义了transform 处理器。
JAXP1.1 的解析器提供了SAX2 和 DOM2 支持,同时支持XML1.0 第二版,也支持名空间。JAXP1.1 的TrAX 部分提供了对Xslt 推荐标准1.0 版本的支持。
下面的例子分别是使用JAXP获得 Document Builder 建立一个DOM 对象套式文件,以及使用JAXP获得一个 SAX 语法分析器剖析一个XML 文件。
(1)DOMDemo.java 源程序代码详见http://linux.ccidnet.com的期刊浏览第11期。
(2)SAXDemo.java 源程序代码详见http://linux.ccidnet.com的期刊浏览第11期。
有关JAXB 和 JDOM 的编程,由于篇幅有限,在此就不多说了。
1.Java 与 XML 结合从用户使用的应用界面来说,XML 可以用来自定义用户界面。如果将Java 的图形界面Swing 技术应用以XML 的形式来设置,就可以同时发挥Java 的“write one, use many”特性。
2.Java 提供了Servlet 和 JSP (JavaServer Page) 。实际上 XML 和 Servlet、JSP 的相互结合,XML 可以成为Servlet或JSP的输出输入语言。XML 不仅提供具有意义的数据,也提供了验证的方式(DTD),使得程序能轻易地获得内容,并能够彻底地完成内容数据和表达方式的分离。
3.XML 通过Java 的JDBC与Web 数据库相结合。以XML为基础的新一代环境是直接面对Web数据的,不仅可以很好地兼容原有的Web应用,而且可以更好地实现Web中的信息共享与交换。XML可看作为一种半结构化的数据模型,很容易地将其文档描述与关系数据库中的属性一一对应起来,实施精确地查询与模型抽取。XML能增加结构和语义信息,使计算机和服务器即时处理多种形式的信息。因此,运用XML的扩展功能不仅能从Web服务器下载大量的信息,还能大大减少网络业务量。
4.XML 与 Java 的 EJB(Enterprise Java Bean) 结合。XML 在EJB 上应用,对于数据的沟通和EJB 的参数设置,使得EJB可以将自己所包含的数据依照JSP 和 Servlet 要求,以 XML 的形式返回,让JSP 和 Servlet 自行去处理和显示这些数据有关的工作。一个EJB 可能用到的参数会很多,并且很复杂,如果可以用XML 来定义一个清楚的参数表,这样就可以依据不同的需求来修改EJB 操作的方式,让工作更有效率。
5.Java 的JMS、Java/IDL(CORBA)、Java RMI 及SOAP 等各种分布式的处理,与XML 的XML-RPC 和 SOAP 都具有相似的功能。XML-RPC 和 SOAP 都是将原本是以二进制形式传递的消息,用XML 来表达,这样确保了所有的应用程序都可以读取这些消息,整个分布式的环境更加开放。
本文地址:http://com.8s8s.com/it/it12817.htm