2011-07-25 135 views
34

我需要验证具有给定XSD文件的XML文件。我只需要该方法返回true,否则验证正常或错误。根据XSD验证XML

回答

59

返回简单对或错(您也不需要任何外部库):

static boolean validateAgainstXSD(InputStream xml, InputStream xsd) 
{ 
    try 
    { 
     SchemaFactory factory = 
      SchemaFactory.newInstance(XMLConstants.W3C_XML_SCHEMA_NS_URI); 
     Schema schema = factory.newSchema(new StreamSource(xsd)); 
     Validator validator = schema.newValidator(); 
     validator.validate(new StreamSource(xml)); 
     return true; 
    } 
    catch(Exception ex) 
    { 
     return false; 
    } 
} 
+6

不应该只将**用于可执行的情况,**不可用于**的控制流?如果执行'测试',我不会认为它是可选的。它可以通过,或失败。两个选项必须考虑。也看看http://stackoverflow.com/questions/15732/whats-the-best-way-to-validate-an-xml-file-against-an-xsd-file – mike

+0

此代码不工作时要验证的文件包含DOCTYPE声明,如果有人知道为什么? – HugoPoi

+1

如果有人得到错误“没有SchemaFactory tha实现[...]”,这可能是因为你做了和我一样的错误,它使用常量XMLConstants.W3C_XML_SCHEMA_INSTANCE_NS_URI。用上面提到的常量替换它。 –

3
public boolean validate() { 
    DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); 

    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", 
     "http://domain.com/mynamespace/mySchema.xsd"); 
    Document doc = null; 
    try { 
    DocumentBuilder parser = factory.newDocumentBuilder(); 
    doc = parser.parse("data.xml"); 
    return true; 
    } catch (Exception e) { 
    return false; 
    } 
} 
2

XMLUnit有一些不错的班级要做到这一点,有一个例子,他们的README文件:

Validator v = Validator.forLanguage(Languages.W3C_XML_SCHEMA_NS_URI); 
v.setSchemaSources(Input.fromFile("local.xsd").build()); 
ValidationResult result = v.validateInstance(new StreamSource(new File("local.xml"))); 
return result.isValid();