首页 | 资讯动态 | linux基础 | 系统管理 | 网络管理 | 编程开发 | linux数据库 | 服务器技术 | linux相关 | linux认证 | 嵌入式 | 下载中心 | 专题 | linux招聘 | 镜像站
OKLinux中文技术站
·设为首页
·加入收藏
·联系我们
系统管理: 中文环境 系统管理 桌面应用 内核技术 | Linux基础: 基础入门 安装配置 常用命令 经验技巧 软件应用 | Linux数据库: Mysql Postgre Oracle DB2 Sybase other
网络管理: 网络安全 网络应用 Linux服务器 环境配置 黑客安全 | 编程开发: PHP CC++ Python Perl Shell 嵌入式开发 java jsp | PHP技术: PHP基础 PHP技巧 PHP应用 PHP文摘
Linux资讯 Linux招聘 Linux专题 Apache | Linux相关: 硬件相关 Linux解决方案 Linux认证 企业应用 其它Unix | 相关下载: 资料下载 参考手册 开发工具 服务器类 软路由 其它
 技术搜索:
会员中心 注册会员 高级搜索  
  → 当前位置:首页>编程开发>java>java企业应用>正文

Java 安全:Java 语言的 XML 验证 API

http://www.oklinux.cn  2008-03-07  来源: 赛迪网 duduwjf  会员收藏  游客收藏  【 】 

[good]检查文档是否遵循了模式中规定的规则。不同的解析器和工具支持不同的模式语言如 DTD、W3C XML Schema 语言、RELAX NG 和 Schematron。Java 5™ 增加了统一的验证应用程序编程接口(API),可以把文档和用这种或那种语言编写的模式作比较。了解这种 XML 验证 API。

验证是一种强大的工具。它可以快速检查输入是否大体上符合预期的形式,立刻拒绝与处理目标相距甚远的文档。如果数据中存在问题,早发现要比晚发现好。

对于可扩展标记语言(XML)来说,验证一般意味着用各种模式语言为文档内容编写详细的规范,这些语言包括万维网联盟(W3C)的 XML Schema Language (XSD)、RELAX NG、文档类型定义(DTD)和 Schematron 等。有时候验证在解析的同时进行,有时候在解析完成后立刻进行。但一般在对输入的其他处理之前完成。(这一段描述只是粗略来说,因为存在例外。)

直到最近,程序请求验证的具体应用程序编程接口(API)还随着模式语言和解析器的不同而不同。DTD 和 XSD 是 Simple API for XML (SAX)、文档对象模型(DOM)和 Java™ API for XML Processing (JAXP) 常见的配置选项。RELAX NG 需要自定义的库和 API。Schematron 可以使用 Transformations API for XML,还有其他模式也要求程序员学习更多的 API,尽管执行的操作基本相同。

Java 5 引入了 javax.xml.validation 包,提供了独立于模式语言的验证服务接口。这个包也可用于 Java 1.3 及更高版本,不过要单独安装 JAXP 1.3。其他产品中,Xerces 2.8 包含了这个库的实现。

验证

javax.xml.validation API 使用三个类来验证文档:SchemaFactory、Schema 和 Validator。还大量使用了 TrAX 的 javax.xml.transform.Source 接口来表示 XML 文档。简言之,SchemaFactory 读取模式文档(通常是 XML 文件)并创建 Schema 对象。Schema 创建一个 Validator 对象。最后,Validator 对象验证表示为 Source 的 XML 文档。

清单 1 显示了一个简单的程序,用 DocBook XSD 模式验证在命令行中输入的 URL。


清单 1. 验证可扩展超文本标记语言(XHTML)文档
import java.io.*;
import javax.xml.transform.Source;
import javax.xml.transform.stream.StreamSource;
import javax.xml.validation.*;
import org.xml.sax.SAXException;

public class DocbookXSDCheck {

public static void main(String[] args) throws SAXException, IOException {

// 1. Lookup a factory for the W3C XML Schema language
SchemaFactory factory =
SchemaFactory.newInstance("http://www.w3.org/2001/XMLSchema");

// 2. Compile the schema.
// Here the schema is loaded from a java.io.File, but you could use
// a java.net.URL or a javax.xml.transform.Source instead.
File schemaLocation = new File("/opt/xml/docbook/xsd/docbook.xsd");
Schema schema = factory.newSchema(schemaLocation);

// 3. Get a validator from the schema.
Validator validator = schema.newValidator();

// 4. Parse the document you want to check.
Source source = new StreamSource(args[0]);

// 5. Check the document
try {
validator.validate(source);
System.out.println(args[0] " is valid.");
}
catch (SAXException ex) {
System.out.println(args[0] " is not valid because ");
System.out.println(ex.getMessage());
}

}

}


下面是用捆绑到 Java 2 Software Development Kit (JDK) 5.0 的 Xerces 版本检查一个无效文档时的典型输出。

file:///Users/elharo/CS905/Course_Notes.xml is not valid because cvc-complex-type.2.3: Element 'legalnotice' cannot have character [children], because the type's content type is element-only.
改变验证所依据的模式、要验证的文档甚至使用的模式语言都很简单。但无论什么情况,验证都需要经过下列五个步骤:

为编写模式所用的语言加载一个模式工厂。
编译源文件中的模式。
用编译后的模式创建一个验证程序。
为需要验证的文档创建 Source 对象。StreamSource 通常最简单。
验证输入的源文档。如果文档无效,validate() 方法将抛出 SAXException。否则什么也不显示。
可以反复使用同一个验证程序和同一个模式多次。但是所有类都不是线程安全的或者可重入的。如果用多个线程同时验证,一定要保证每个线程有自己的 Validator 和 Schema 对象。

用文档指定的模式验证

有些文档指定了希望作为验证基础的模式,一般使用 xsi:noNamespaceSchemaLocation 和/或 xsi:schemaLocation 属性来指定,比如:

xsi:noNamespaceSchemaLocation="http://www.example.com/document.xsd">
...


如果创建的模式没有指定 URL、文件或者源,则 Java 语言就会创建一个这样的东西,用于在要验证的文档中查找应该使用的模式。比如:

SchemaFactory factory = SchemaFactory.newInstance("http://www.w3.org/2001/XMLSchema");
Schema schema = factory.newSchema();



不过通常不希望这样做。一般应该由文档的消费者而不是生产者选择模式。另外,这种方法仅适用于 XSD。其他模式语言都需要明确指定模式的位置。


抽象工厂

SchemaFactory 是一个抽象工厂。抽象工厂设计模式使得这种 API 能够支持多种不同的模式语言和对象模型。一种实现通常只能支持多种语言和模型的一部分。但是,一旦掌握了用 RELAX NG 模式(比方说)验证 DOM 文档的 API,就能用相同的 API 对 W3C 模式验证 JDOM 文档。

共4页: 上一页 1 [2] [3] [4] 下一页

上一篇:设计模式之--Decorator模式、BUG和AOP   下一篇:Java语言深入--基于JNDI的应用开发


收藏于收藏夹】 【评论】 【推荐】 【打印】 【关闭
相关文档
·Java语言深入--基于JNDI的应用开发
·设计模式之--Decorator模式、BUG和AOP
·数据库相关:Hibernate对多表关联查询
·开发框架:我认为Spring的一些负面因素
·开发框架:Struts 基础介绍及开发流程
·超级简单的 sqlmap 工具(ajf sql map)
·开发框架--讨论Spring技巧之简洁配置
·设计及设计模式--设计模式之事务处理
·visitor模式概念-- visitor模式进一步
·数据库相关:hibernate O/R映射之基础
·Java GUI:在Java中监控文本框的变化
·Java GUI--浅析Swing设计JOptionPane
·多线程设计模式:了解wait/notify机制
·Java语言:敏捷开发技巧-消除代码异味
·Hibernate源码中几个包的作用简要介绍
·开发框架--Hibernate为什么如此成功
发表评论
密码: 匿名评论
评论内容:

(不超过250字,需审核后才会公布,请自觉遵守互联网相关政策法规)
 
  最新文档
·Java SE6调用Java编译器的两种新方法
·表现层框架Struts/Tapestry/JSF比较
·在Web项目中用到JNI时应该注意的问题
·JBuilder7 Weblogic7 mysql开发EJB配置
·进阶:Java Reflection (JAVA反射)详解
·以全局的固定顺序获取多个锁来避免死锁
·JAVA高级:Java中限时线程回调方式的实
·超线程多核心下Java多线程编程彻底分析
·开发JAVA编程中字符串分割的两种方法
·Java理论和实践:用软引用阻止内存泄漏
·JAVA入门基础:区分引用类型和原始类型
·学习心得 - JSP处理异常及一些高级主题
  阅读排行
·Commons-logging Log4j 的入门指南
·进阶:Java Reflection (JAVA反射)详解
·服务器及中间件:TomCat 多虚拟站点配置
·开发框架:一篇关于SSH架构的简单总结
·jboss4.0下使用MySql数据源的设置方法
·Java语言:敏捷开发技巧-消除代码异味
·Java SE6调用Java编译器的两种新方法
·使用JAVA中的动态代理实现数据库连接池
·架构与模式:多线程有几种常用的编程模
·数据库相关:Log4j和JDBMonitor的比较
·开发框架-Struts里过滤器的简单使用
·表现层框架Struts/Tapestry/JSF比较
·在Web项目中用到JNI时应该注意的问题
·Java语言深入--基于JNDI的应用开发
·开发框架:利用STRUTS实现国际化支持
网摘收藏: