【发布时间】:2010-12-09 01:42:15
【问题描述】:
我需要根据 XML 架构验证 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)?
【问题讨论】:
标签: java xml validation schema xml-validation