在没有特定XSD的情况下验证XML

问题描述:

我想在使用XMLInputFactory创建XMLStreamReader时验证(有效xml文件)xml。在没有特定XSD的情况下验证XML

我知道可以在工厂javax.xml.stream.isValidating中设置属性以允许特定实现验证(在我的情况下为xml)。但我正在与java 6 build 43(Jboss eap 6.0),并且无法更新,所以这不适用于我(kwnon问题)。

因此,如果有人知道任何API(除了StAX)可以做同样的事情,那将是非常棒的! 请让我知道是否有什么不清楚的解释。

+0

这是很不清楚你问的。对于初学者来说,验证总是针对某种类型的模式(XSD,RELAX,Schematron等)。对于***有效的XML ***和***格式良好的XML ***之间的区别,我建议您阅读[** this **](http://*.com/a/25830482/290085 )。谢谢。 – kjhughes 2014-11-04 12:50:17

+0

你是对的灰烬。我的意思是格式良好的xml文件。例如,当我用firefox打开一个没有格式良好的xml文件时,它显示一个错误(示例XML解析错误)。 – 2014-11-04 13:37:59

发现了它,我使用的API SAX至(独立地为XSD模式的)创建一个解析器使用所提供的SAXParserFactory和来解析文件。 (更多细节可以在http://apiacoa.org/publications/teaching/xml/api-xml.pdf的页面(23/24)找到)

另外,不要忘记标记/重置你的输入流之前/之后你用解析器解析它(这将抛出一个异常,如果XML文件格式不正确),因此如果解析不失败,您可以保持原样。

您可以通过IBM validation API 尝试的Java XML验证API,你可以使用javax.xml.validationjavax.xml.validation

例如:

import javax.xml.XMLConstants; 
import javax.xml.transform.Source; 
import javax.xml.transform.stream.StreamSource; 
import javax.xml.validation.*; 
... 

URL schemaFile = new URL("http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd"); 
Source xmlFile = new StreamSource(new File("web.xml")); 
SchemaFactory schemaFactory = SchemaFactory 
    .newInstance(XMLConstants.W3C_XML_SCHEMA_NS_URI); 
Schema schema = schemaFactory.newSchema(schemaFile); 
Validator validator = schema.newValidator(); 
try { 
    validator.validate(xmlFile); 
    System.out.println(xmlFile.getSystemId() + " is valid"); 
} catch (SAXException e) { 
    System.out.println(xmlFile.getSystemId() + " is NOT valid"); 
    System.out.println("Reason: " + e.getLocalizedMessage()); 
} 

编辑:

SchemaFactory factory = SchemaFactory.newInstance("http://www.w3.org/2001/XMLSchema"); 

     File schemaFile = new File("schema.xsd"); 

     Schema xsdScheme = factory.newSchema(schemaFile); 

     Validator validator = xsdScheme.newValidator(); 

     Source source = new StreamSource(xmlfile); 

     validator.validate(source); 

一个链接,我发现SO xsd validation

+0

他问*“没有一个特定的XSD”*,但你提供了一个特定的XSD('http:// java.sun.com/xml/ns/j2ee/web-app_2_4.xsd')的答案? – kjhughes 2014-11-04 12:54:23