编辑:啊!!!我试图做一个简单的“概念验证”(问题的例子),但是并没有出现错误! 因此,我回过头来,终于在我自己的“顶级” xsd中发现了一个简单的错字! 现在一切似乎都很好:)
我有两个“顶级” xsd文件,其中包括一堆“子级别” xsd文件。它们都具有相同的名称空间。我无法控制xsds,也无法更改它们。
我需要针对这些xsds验证一系列xml字符串。我事先不知道我需要验证两个给定的xml中的哪个。 我在Java 8中尝试了以下代码:
SchemaFactory schemaFactory = SchemaFactory.newInstance(XMLConstants.W3C_XML_SCHEMA_NS_URI);
try {
Schema schema = schemaFactory.newSchema(new Source[] {
new StreamSource(new File("A.xsd")),
new StreamSource(new File("B.xsd"))
});
Validator validator = schema.newValidator();
validator.validate(new StreamSource(new StringReader(xmlString)));
} catch (SAXException e) {
e.printStackTrace();
}
这仅在xmlString应该针对A.xsd进行验证时才有效。如果xmlString应该针对B.xsd进行验证,则会收到错误消息
org.xml.sax.SAXParseException; lineNumber: 1; columnNumber: 80; cvc-elt.1: Cannot find the declaration of element <toplevel element of xml>.
...以及如果我交换A.xsd和B.xsd的另一种方法。
然后,我尝试使用与A和B相同的名称空间创建自己的“顶级” xsd:
<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" targetNamespace="http://example.com/abc/def/01/02" version="1.0">
<xs:include schemaLocation="A.xsd"/>
<xs:include schemaLocation="B.xsd"/>
</xs:schema>
...但是我在A和B的xmlStrings上都遇到相同的错误。 最后一件事真的让我震惊。 A和B包含多个包含,并且只要我一次只指定一个包含,就可以说运行良好,但是,如果我使包含A和B的xsd无效,那么什么都行不通!
我什至尝试实现自己的LSResourceResolver(几乎)像此答案https://stackoverflow.com/a/2342859中的那个一样,即使它似乎将正确的xsd部分和所有内容一起加载,我仍然遇到相同的错误。 / p>
如何在向schemaFactory提供两个或多个xsd或使用include语句制作自己的xsd时使验证工作?