使用Java及XML Schema对XML进行校验

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;
  }
}