2011-07-25 173 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();