0

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

4

1 回答 1

0

目前,您的解析器无法针对您的架构验证您的文档,因为架构不可用(并且解析器甚至没有配置为验证您的文档)。为了自动实现这一点,我认为有两种选择:

  1. 编辑您的 XML 以包含 xsi:schemaLocation 属性(虽然不确定是否完全支持)

  2. 为您的命名空间注册架构:

代码:

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);
于 2009-10-22T12:46:37.737 回答