2011-07-25 28 views
34

Tôi cần xác thực tệp XML bằng một tệp XSD đã cho. Tôi chỉ đơn giản là cần phương thức trả về true nếu việc xác thực được thực hiện tốt hay sai.Xác thực XML đối với XSD

Trả lời

59

Trả về đơn giản là đúng hoặc sai (bạn cũng không cần bất kỳ thư viện bên ngoài nào):

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

Không nên thực thi ** chỉ ** được sử dụng cho các tình huống thực thi và ** không ** cho luồng điều khiển? Tôi sẽ không xem xét nó execptional, nếu thực hiện một 'thử nghiệm'. Nó có thể vượt qua, hoặc thất bại. Hai lựa chọn người ta phải xem xét. Ngoài ra, hãy xem http://stackoverflow.com/questions/15732/whats-the-best-way-to-validate-an-xml-file-against-an-xsd-file – mike

+0

Mã này không hoạt động khi tệp để xác thực có chứa khai báo DOCTYPE, nếu ai đó biết lý do tại sao? – HugoPoi

+1

Trong trường hợp ai đó gặp lỗi "Không có lược đồ thực hiện tha [...]", có thể là do bạn đã làm lỗi tương tự như tôi, sử dụng hằng số XMLConstants.W3C_XML_SCHEMA_INSTANCE_NS_URI. Thay thế nó bằng hằng số được đề cập ở trên. –

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

sức này phụ thuộc vào thư viện bạn sử dụng nhưng googling xung quanh với "làm thế nào để xác thực tệp xml trong java" đã cho tôi những kết quả này, nơi bạn có thể tìm thấy câu trả lời của bạn:

first interesting result

second interesting result

+0

Cảm ơn thông tin đó. Giúp tôi. – Andez

2

XMLUnit có một số lớp học thoải mái để làm điều này, có một ví dụ trong tập tin README của họ:

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(); 
Các vấn đề liên quan