我现在在写一个解析xml的java程序,用的是dom。有一个schema文件,需要判断xml文件是否符合这个schema,符合就解析xml文件,不符合就报错。总之就是要校验一下xml文件。我在网上找到一个程序:
public boolean validate(InputStream in, InputStream schema, ErrorHandle errorHandle)
            throws Exception {
        log.debug("DefaultParser.validate() begin:");
        boolean result = false;
        DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
        factory.setNamespaceAware(true);
        factory.setValidating(true);
        factory.setAttribute("http://java.sun.com/xml/jaxp/properties/
 schemaLanguage", "http://www.w3.org/2001/XMLSchema");
        factory.setAttribute("http://java.sun.com/xml/jaxp/properties/
 schemaSource",new File("myschema.xsd"));
        DocumentBuilder parser = factory.newDocumentBuilder();
        parser.setErrorHandler(errorHandle);        parser.parse(in);        if (errorHandle.getMsgList().size() == 0) {
            result = true;
        }
        log.debug("DefaultParser.validate() result:" + result);
        return result;
    }
但是运行之后没有效果,明显不符合schema的xml文件程序也不报错,不知道问题出在哪里。这个程序好像是针对sax的,不知道我用在dom上行不行。还有那个errorhandler到底是干什么的?,文档上面说是SAX 错误处理程序的基本接口,dom可以使用吗?我用程序中设置了myschema.xsd之后,java是调用xmlns中的schema还是程序设定的值?

解决方案 »

  1.   

    如果不嫌麻烦,和不考虑性能的话,用JAXB. schema可以在JAXB中生成一系列绑定类,其中包括验证类,然后用里面的unmashaller类将xml文件读入,如果你的ummarshaller.setValidate(true),则读入的xml不符合schema的话会报错,具体API用法我不记得了,JAXB在SUN发布的JWSDP包里,jdk1.4要用jwsdp2.0以下的包,具体的安装和配置包里的文档都有的.
      

  2.   

    SchemaFactory factory=SchemaFactory.newInstance("http://www.w3.org/2001/XMLSchema");
    File file=new File("test.xsd");
    Schema schema=factory.newSchema(file);
    Source source=new StreamSource("x.xml");
    Validator validate=schema.newValidator();
    validate.validate(source);