应用程序根据 XSD 验证 XML:允许 XML 中的 XSD 引用

hal*_*oei 4 java xml xsd dom

我的应用程序根据 XSD(在 jar 中)验证 XML :

private Document createAndValidate(Schema schema) throws IOException, SAXException, ParserConfigurationException {
  DocumentBuilderFactory documentBuilderFactory = DocumentBuilderFactory.newInstance();
  documentBuilderFactory.setValidating(false); // DTD validation
  documentBuilderFactory.setNamespaceAware(false);
  documentBuilderFactory.setSchema(schema);

  DocumentBuilder documentBuilder = documentBuilderFactory.newDocumentBuilder();
  documentBuilder.setErrorHandler(new SaxErrorHandler());

  return documentBuilder.parse(file.toFile());
}
Run Code Online (Sandbox Code Playgroud)

到目前为止效果很好。

但由于使用引用的 XSD(可以在本地计算机上的任何位置)创建 XML 更容易,因此 XML 开始如下:

<?xml version="1.0" encoding="UTF-8"?>
<Definition
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:noNamespaceSchemaLocation="C:\definition_schema.xsd">
Run Code Online (Sandbox Code Playgroud)

现在,当我的应用程序解析该 XML 文件时,由于此 XSD 引用而无法验证:

cvc-complex-type.3.2.2:属性“xsi:noNamespaceSchemaLocation”不允许出现在“定义”中

我试图添加<xs:attribute name="xsi:noNamespaceSchemaLocation" type="xs:string" />Definition元素,但该属性名称无效。

在我(重新)打开和验证它之前,我可以打开 XML 文件并删除该属性。但必须有更好的解决方案。

我该如何处理?

And*_*eas 5

xmlns:xsi是命名空间声明,因此更改为setNamespaceAware(true).

将其设置为false,这两个属性只是名称中包含 a 的通用属性:。使用true:成为命名空间前缀 (xmlnsxsi) 和命名空间属性之间的分隔符。

您当然还需要添加一个xmlns="http://example.org/MyNamespace"属性,以匹配模式的目标命名空间。