使用Java及XML Schema对XML进行校验
Submitted by hubdog on Sat, 2009-01-10 19:53
Flex对于XML处理非常方便,是我用过的最好的,它可以很容易的将XML映射为对象代理,并以对象属性的方式访问XML的节点。比如说对于下面的XML
<A>
<B/>
</A>
我们可以将其映射为对象后,通过Object.A.B来直接获取XML节点信息,好处就是不需要编写冗长的DOM或者SAX解析访问代码了。但是有一个比较大的问题是这种访问不是强类型的,也就是说代码中可以写 Object.A的调用,但是实际上如果定义的XML信息如果编写错误,没有定义对应的A节点的话,要到运行时才能发现,这就逼得我们要写大量try catch来防止这种错误,结果就是虽然解决了一个棘手问题,但又产生了一个新问题。
幸好,XML的设计者们已经想到了这个问题,W3C的XML Schema可以用来验证访问的XML是否符合预定义的标准。但是Action Script本身对于XML Schema没有提供支持,不过Flex本身可以访问任意语言编写的服务器,所以我们可以用Java来实现XML的校验,Dr Herong Yang的这个例子可以很方便的实现XML的校验。
/* * XsdSchemaSaxValidator.java * Copyright (c) 2007 by Dr. Herong Yang. All rights reserved. */ import javax.xml.validation.SchemaFactory; import javax.xml.validation.Schema; import javax.xml.XMLConstants; import javax.xml.transform.sax.SAXSource; import org.xml.sax.InputSource; import javax.xml.validation.Validator; import java.io.*; class XsdSchemaSaxValidator { public static void main(String[] a) { if (a.length<2) { System.out.println("Usage:"); System.out.println("java XsdSchemaValidator schema_file_name " + "xml_file_name"); } else { String schemaName = a[0]; String xmlName = a[1]; Schema schema = loadSchema(schemaName); validateXml(schema, xmlName); } } public static void validateXml(Schema schema, String xmlName) { try { // creating a Validator instance Validator validator = schema.newValidator(); System.out.println(); System.out.println("Validator Class: " + validator.getClass().getName()); // preparing the XML file as a SAX source SAXSource source = new SAXSource( new InputSource(new java.io.FileInputStream(xmlName))); // validating the SAX source against the schema validator.validate(source); System.out.println(); System.out.println("Validation passed."); } catch (Exception e) { // catching all validation exceptions System.out.println(); System.out.println(e.toString()); } } public static Schema loadSchema(String name) { Schema schema = null; try { String language = XMLConstants.W3C_XML_SCHEMA_NS_URI; SchemaFactory factory = SchemaFactory.newInstance(language); schema = factory.newSchema(new File(name)); } catch (Exception e) { System.out.println(e.toString()); } return schema; } }