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

Application validates XML against XSD: allow XSD reference in XML

我的应用程序根据 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());
}

到目前为止一切正常。

但是由于使用引用的 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">

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

cvc-complex-type.3.2.2: Attribute 'xsi:noNamespaceSchemaLocation' is not allowed to appear in 'Definition'

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

我可以打开 XML 文件并删除属性,然后再(重新)打开并验证它。但一定有更好的解决办法。

我该如何处理?

xmlns:xsi是命名空间声明,所以改成setNamespaceAware(true).

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

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