如何在 Web 应用程序中加载多个 XSD?

How load the multiple XSDs in the web application?

我们有两个架构 (XSD) 文件,一个文件包含另一个。 当我们加载架构文件以验证 XML 文件时,它没有正确加载到 Web 应用程序中。 它为包含的架构文件元素抛出错误。

        Source[] sources = new StreamSource[2];

            Source schemaFile = new StreamSource(Test.class.getClassLoader().getResourceAsStream(“a.xsd”));
            sources[0] = schemaFile;

            Source schemaFile1 = new StreamSource(Test.class.getClassLoader().getResourceAsStream(“b.xsd”));
            sources[1] = schemaFile1;

            Schema schema = factory.newSchema(sources);

b.xsd 包含 a.xsd 文件。 但是当我们在 main 方法中 运行 时,相同的代码工作正常。

有人可以提出解决此问题的建议吗?

我们可以使用 org.w3c.dom.ls 包中的 LSResourceResolver 来做到这一点。 Problem validating an XML file using Java with an XSD having an include

有什么方法可以在 Web 基础应用程序中使用 javax 来做到这一点吗?

错误:

org.xml.sax.SAXParseException: cvc-elt.1: Cannot find the declaration of element 'ns:Request'.
       at org.apache.xerces.util.ErrorHandlerWrapper.createSAXParseException(Unknown Source)
       at org.apache.xerces.util.ErrorHandlerWrapper.error(Unknown Source)
       at org.apache.xerces.impl.XMLErrorReporter.reportError(Unknown Source)
       at org.apache.xerces.impl.XMLErrorReporter.reportError(Unknown Source)
       at org.apache.xerces.impl.xs.XMLSchemaValidator.handleStartElement(Unknown Source)
       at org.apache.xerces.impl.xs.XMLSchemaValidator.startElement(Unknown Source)
       at org.apache.xerces.jaxp.validation.DOMValidatorHelper.beginNode(Unknown Source)
       at org.apache.xerces.jaxp.validation.DOMValidatorHelper.validate(Unknown Source)
       at org.apache.xerces.jaxp.validation.DOMValidatorHelper.validate(Unknown Source)
       at org.apache.xerces.jaxp.validation.ValidatorImpl.validate(Unknown Source)
       at javax.xml.validation.Validator.validate(Unknown Source)

LSResourceResolver 是一个很好的工具,它使用整个 xml 解析基础结构。

简单的技巧是:

  • 不使用来自 class 加载程序的流,而是将您的两个架构文件复制到临时位置
  • 改用复制文件的文件路径

或者更容易

  • 不将您的架构存储在 classes 旁边的 src 文件夹中,而是存储在 web 文件夹下。您可以获得 Web 下资源的真实文件路径,并使用它们来启动模式。