我需要根据 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)?