分享
 
 
 

模式验证结构-JAXP1.3的特性

王朝other·作者佚名  2008-05-19
窄屏简体版  字體: |||超大  

XML 处理的Java API (JAXP) 1.3在Java 2 平台里已经首先引入了, 标准版(J2SE) 5.0 并且同样也在目前已可使用的Java Web Services Developer Pack (Java WSDP)中 。 JAXP 1.3 新增了一个模式验证结构(SVF), 也叫验证API, 它提供了依靠模式高效验证XML的高级能力。SVF同样也提供了比JAXP 1.2中更高的执行效率。

在考察SVF之前, 我们看看早期的模式验证方法。以下的代码片断示范了SAX解析的方法:

SAXParserFactory sf = SAXParserFactory.newInstance();

sf.setNamespaceAware(true);

sf.setValidating(true);

SAXParser sp = sf.newSAXParser();

sp.setProperty(

SCHEMA_LANGUAGE, XMLConstants.W3C_XML_SCHEMA_NS_URI);

sp.setProperty(SCHEMA_SOURCE, schema);

sp.parse(new File(xml), dh);

基本的步骤是:

1.创建一个SAXParserFactory 对象。

2.配置SAXParserFactory对象来生成支持XML命名空间的分析程序, 以及需要解析的验证文档。

3.创建一个SAX 分析程序。

4.设置SAX 分析程序属性的模式语言和模式来源。在本例中为W3C XML模式。

5.解析文件。

注意,这个过程的耦合验证和XML处理。

作为比较, SVF方法中, XML文件模式验证从XML 处理中分离出来。SVP方法的第一步是编译模式:

final String sl = XMLConstants.W3C_XML_SCHEMA_NS_URI;

SchemaFactory factory = SchemaFactory.newInstance(sl);

StreamSource ss = new StreamSource("mySchema.xsd");

Schema schema = factory.newSchema(ss);

SchemaFactory是一个模式编译器。它读指定的模式, 根据指定的模式语言的约束来检查模式语法和语义, 并且返回一个在内存中不变的Schema对象。不可变意味着一旦创建了Schema对象约束设置就不可改变。一个应用程序使用同一个Schema对象验证同样的文件两次也总会得到同样的结果。

然后,您使用模式验证一个XML文件。根据你的需要将有三个方法可供选择:

?在DocumentBuilderFactory 或SAXParserFactory上设置了Schema实例

?创建一个Validator

?创建一个ValidatorHandler (验证SAX流)

所有这三个方法都保证, XML文件只在从Schema实例中获得的模式中有效。

查看第一种方法, 在一个factory上设置Schema实例:

SAXParserFactory spf = SAXParserFactory.newInstance();

spf.setSchema(schema);

SAXParser parser = spf.newSAXParser();

parser.parse(<XML DOCUMENT);

在这里, 同一个Schema实例传输到所有的由SAXParserFactory创建的SAXParser实例中。SAXParser对象解析XML 文件并且同时验证它所依靠的Schema实例。 由于SAXParser并不为需要解析的每个XML文件都反复装载模式,这个方法可为整个模式处理提高相当的效率。与前面的方法比较,前面需要为每个需要验证的XML文件重复的装载指定的模式。

在您装载一个Schema对象到内存以后, 您能采用第二个方法,通过Schema对象使用Validator 验证XML 文件。首先您从Schema对象中创建一个Validator 对象。 然后调用在Validator 对象中的validate() 方法来验证:

Validator v = schema.newValidator();

v.validate(new StreamSource(xml));

Validator对象接受java.xml.transform.Source作为输入。 这意味着, 它可接受基于事件, SAX 源(SAXSource) 和基于对象, 文档对象模型(DOM) 源(DOMSource) 。 接受DOMSource作为输入, Validator能由指定的Schema对象验证一个在内存中的DOM文件或节点。

Validator v = schema.newValidator();

v.validate(new DOMSource(<DOM NODE));

如果要验证一个DOM 节点或指定的SAXSource,您也可考虑Validator方法。既使SAX 驱动器的执行是来自另外的一个供营商这个方法仍然可以运作。

第三个方法是创建一个特殊设计的javax.xml.validation.ValidatorHandler来验证SAX 事件:

SAXParserFactory spf = SAXParserFactory.newInstance();

spf.setNamespaceAware(true);

XMLReader reader = spf.newSAXParser().getXMLReader();

ValidatorHandler vh =

schema.newValidatorHandler();

//key is to set "ValidatorHandler" as ContentHandler

//so that SAX event can be validated

reader.setContentHandler(vh);

reader.parse(xml);

注意验证SAX事件, 您需要设置ValidatorHandler 为ContentHandler 。

使用ValidatorHandler, 您也能利用模式验证一个JDOM 文件。 实际上, 任一个可在一个SAX流顶部建立或可产生SAX事件的对象模型(譬如XOM 和DOM4J)能由SVF利用一个模式来验证XML 文件。 这是可能的,因为ValidationHandler 能验证一个SAX流。 以下代码片断说明了一个JDOM文件是如何利用一个模式来验证的,假设你已经获取了前面例子中显示的ValidatorHandler:

SAXOutputter so = new SAXOutputter(vh);

so.output(jdomDocument);

SAXOutputter 对象为JDOM 文件释放SAX事件。 SAX 事件然后由ValidatorHandler验证。

您能使用SVF做的其它事是, 譬如在转换以后验证XML或获得模式类型信息。使用SVF的更多信息请参考:Easy and Efficient XML Processing: Upgrade to JAXP 1.3

运行例代码

范例程序包伴有本提示。 范例程序包中的代码包括编码实例和展示技术报道信息。在这个程序包里还有额外范例。 例如, 其中一个例子比较使用新的SVF模式验证性能和设置二个模式属性的前面的方法。 其它范例显示利用模式怎么验证Transformer的输出。 安装和运行范例:

1.下载sample file并解压缩其内容。你能在形如<install_dir\ValidationFramework的目录中看到解压缩出来的目录。例如,如果你解压缩内容到一台Windows机器上的C:\中,你最近创造的目录就应该是C:\ValidationFramework 。解压缩出来的内容包括一个README文件,此文件中包括了运行例子的介绍。你能使用在J2SE 5.0或者Java WSDP 1.6平台上的JAXP 1.3来运行例程序。你也能下载在java.net 上的JAXP 项目页面中的standalone JAXP 1.3 implementation 。

2.运行ValidationFramework 目录中的ant图标。要编译使用如下的命令:

ant compile

反馈信息中,你会看到如下的内容:

Buildfile: build.xml

init:

[mkdir] Created dir: C:\ValidationFramework\build

[mkdir] Created dir:

C:\ValidationFramework\build\classes

compile:

[echo] C:\Program Files\Java\jdk1.5.0\jre

...

BUILD SUCCESSFUL

要运行例子,利用适当的目标来运行ant命令,例如:

ant ValidateSAXStream

在反馈的信息中,你会看到如下的信息输出:

[java] startElement: personnel

[java] startElement: person

[java] startElement: name

[java] startElement: family

[java] characters: Boss

[java] endElement: family

...

[java] startElement: email

[java] characters: five@foo.com

[java] endElement: email

[java] startElement: link

[java] endElement: link

[java] endElement: person

[java] endElement: personnel

BUILD SUCCESSFUL

如果你在J2SE 5.0中运行例子,不考虑JAXP jar的位置的'endorsed' 属性。例如:

ant -Dendorsed=/space/jaxp/jaxp-1_3/dist/ Validate

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
2023年上半年GDP全球前十五强
 百态   2023-10-24
美众议院议长启动对拜登的弹劾调查
 百态   2023-09-13
上海、济南、武汉等多地出现不明坠落物
 探索   2023-09-06
印度或要将国名改为“巴拉特”
 百态   2023-09-06
男子为女友送行,买票不登机被捕
 百态   2023-08-20
手机地震预警功能怎么开?
 干货   2023-08-06
女子4年卖2套房花700多万做美容:不但没变美脸,面部还出现变形
 百态   2023-08-04
住户一楼被水淹 还冲来8头猪
 百态   2023-07-31
女子体内爬出大量瓜子状活虫
 百态   2023-07-25
地球连续35年收到神秘规律性信号,网友:不要回答!
 探索   2023-07-21
全球镓价格本周大涨27%
 探索   2023-07-09
钱都流向了那些不缺钱的人,苦都留给了能吃苦的人
 探索   2023-07-02
倩女手游刀客魅者强控制(强混乱强眩晕强睡眠)和对应控制抗性的关系
 百态   2020-08-20
美国5月9日最新疫情:美国确诊人数突破131万
 百态   2020-05-09
荷兰政府宣布将集体辞职
 干货   2020-04-30
倩女幽魂手游师徒任务情义春秋猜成语答案逍遥观:鹏程万里
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案神机营:射石饮羽
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案昆仑山:拔刀相助
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案天工阁:鬼斧神工
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案丝路古道:单枪匹马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:与虎谋皮
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:李代桃僵
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:指鹿为马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:小鸟依人
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:千金买邻
 干货   2019-11-12
 
推荐阅读
 
 
 
>>返回首頁<<
 
靜靜地坐在廢墟上,四周的荒凉一望無際,忽然覺得,淒涼也很美
© 2005- 王朝網路 版權所有