我需要针对XML Schema验证XML文件,以便从XML中获取架构信息。
我有XML文档,它定义了它的命名空间。像这样:
<?xml version="1.0" encoding="UTF-8"?>
<myelement xmlns="mynamespace">
</myelement>
架构位置不在文档中,所以我需要告诉验证器给定命名空间的架构在哪里。现在我按照以下方式做到:
DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
dbf.setNamespaceAware( true );
DocumentBuilder parser = dbf.newDocumentBuilder();
Document document = parser.parse(new File("mydocument.xml"));
String namespace = document.getChildNodes().item(0).getNamespaceURI();
SchemaFactory factory = SchemaFactory.newInstance(XMLConstants.W3C_XML_SCHEMA_NS_URI);
Source schemaFile = new StreamSource(new File(namespace + ".xsd"));
Schema schema = factory.newSchema(schemaFile);
Validator validator = schema.newValidator();
validator.setErrorHandler(new MyErrorHandler());
validator.validate(new DOMSource(document));
这种方式有效但有两个问题:
1)我必须首先手动解析文档并创建模式,尽管理论上验证器具有自动执行它所需的所有信息。
2)如果我验证Document对象,我没有得到正确的错误行数。为了得到正确的行号,我必须两次解析同一个文档(首先是获取命名空间,第二个是验证)。
有人知道更好的解决方案吗?
在解析之前,有没有办法告诉解析器namespace1对应schema1.xsd,namespace2对应schema2.xsd等?或者我可以编写某种回调函数,解析器可以使用它来询问模式(例如,我可以将LSResourceResolver提供给SchemaFactory)吗?
答案 0 :(得分:0)
目前,您的解析器无法针对您的架构验证您的文档,因为架构不可用(并且解析器甚至未配置为验证您的文档)。为了实现这一目标,我认为有两种选择:
编辑您的XML以包含xsi:schemaLocation属性(不确定这是否完全支持)
注册命名空间的架构:
代码:
SchemaFactory factory = SchemaFactory.newInstance(XMLConstants.W3C_XML_SCHEMA_NS_URI);
Source schemaFile = new StreamSource(new File(namespace + ".xsd"));
Schema schema = factory.newSchema(schemaFile);
DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
dbf.setNamespaceAware( true );
dbf.setValidating(true);
dbf.setSchema(schema);