在没有特定XSD的情况下验证XML
我想在使用XMLInputFactory
创建XMLStreamReader
时验证(有效xml文件)xml。在没有特定XSD的情况下验证XML
我知道可以在工厂javax.xml.stream.isValidating
中设置属性以允许特定实现验证(在我的情况下为xml)。但我正在与java 6 build 43(Jboss eap 6.0),并且无法更新,所以这不适用于我(kwnon问题)。
因此,如果有人知道任何API(除了StAX)可以做同样的事情,那将是非常棒的! 请让我知道是否有什么不清楚的解释。
发现了它,我使用的API SAX至(独立地为XSD模式的)创建一个解析器使用所提供的SAXParserFactory和来解析文件。 (更多细节可以在http://apiacoa.org/publications/teaching/xml/api-xml.pdf的页面(23/24)找到)
另外,不要忘记标记/重置你的输入流之前/之后你用解析器解析它(这将抛出一个异常,如果XML文件格式不正确),因此如果解析不失败,您可以保持原样。
您可以通过IBM validation API 或 尝试的Java XML验证API,你可以使用javax.xml.validation
javax.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
他问*“没有一个特定的XSD”*,但你提供了一个特定的XSD('http:// java.sun.com/xml/ns/j2ee/web-app_2_4.xsd')的答案? – kjhughes 2014-11-04 12:54:23
这是很不清楚你问的。对于初学者来说,验证总是针对某种类型的模式(XSD,RELAX,Schematron等)。对于***有效的XML ***和***格式良好的XML ***之间的区别,我建议您阅读[** this **](http://stackoverflow.com/a/25830482/290085 )。谢谢。 – kjhughes 2014-11-04 12:50:17
你是对的灰烬。我的意思是格式良好的xml文件。例如,当我用firefox打开一个没有格式良好的xml文件时,它显示一个错误(示例XML解析错误)。 – 2014-11-04 13:37:59