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

时间:2015-10-29 15:03:30

标签: java xml dom xsd

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

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:属性'xsi:noNamespaceSchemaLocation'是   不允许出现在“定义”

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

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

我该如何处理?

1 个答案:

答案 0 :(得分:4)

xmlns:xsi is a namespace declaration, so change to setNamespaceAware(true).

With it set to false, the two attributes are just generic attributes whose name happen to contain a :. With true, the : become a separator between the namespace prefix (xmlns and xsi) and the namespace'd attribute.

You will of course also need to add a xmlns="http://example.org/MyNamespace" attribute, matching the target namespace of the schema.