针对多个 XSD 验证 XML 文件并知道哪个验证文件 (jdom2)

Validate XML file against several XSD and know which one validates the file (jdom2)

我想针对两个不同的 XSD 验证 XML 文件,我知道 XML 文件不必针对它们两个进行验证,而只需对其中一个进行验证。然后我需要知道哪个 XSD 文件验证 XML 文件以便访问不同的元素。

XSD 文件属于以下类型:sdf and csdf 但我有自己的版本,所以我不使用 XML header 中存在的模式(和我不想要求用户修改它)。

问题:如何轻松地进行验证测试,然后使用单个 xml 库解析 XML 文件(根据正确的模式) (如果可能,还有 jdom2)?

目前我使用 javax 进行验证,使用 jdom2 访问元素,但我 think/hope 可以使用一个库来做同样的事情,至少是为了不一次又一次地解析文件.好吧,正如 a smilar question 中指出的那样,为了了解 javax 的工作原理,我宁愿不吸毒。

使用 JDOM 2,您可以设置两个不同的 XML readers - 每个模式一个。

然后您可以使用 SAXParser 读取文档,并通过 reader,通过的就是架构正确的那个。

考虑类似 (XMLReaderXSDFactory:

sdfreader = new XMLReaderXSDFactory("http://www.es.ele.tue.nl/sdf3/xsd/sdf3-sdf.xsd");
csdfreader = new XMLReaderXSDFactory("http://www.es.ele.tue.nl/sdf3/xsd/sdf3-csdf.xsd");

然后,使用那些 reader 工厂,您可以设置一个 SAXBuilder with a different constructor:

SAXBuilder sdfbuilder = new SAXBuilder(sdfreader);
SAXBuilder csdfbuilder = new SAXBuilder(csdfreader);

现在,您可以通过其中任何一个来构建文档。无论哪个 "successfully" 构建文档也具有正确的架构。

try {
    Document doc = sdfbuilder.build(somexml);
    System.out.println("Parsed using sdf")
    return doc
} catch (JDOMException x) {
    // parse failed, probably wrong schema....
}

try {
    Document doc = csdfbuilder.build(somexml);
    System.out.println("Parsed using csdf")
    return doc
} catch (JDOMException x) {
    // parse failed, probably wrong schema....
}

// oops, nothing works for this document...