java-应用程序针对XSD验证XML:允许以XML引用XSD

我的应用程序针对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,则:成为命名空间前缀(xmlns和xsi)和命名空间的属性间的分隔符.

当然,您还需要添加xmlns =“ http://example.org/MyNamespace”属性,以匹配架构的目标名称空间.

相关文章

php输出xml格式字符串
J2ME Mobile 3D入门教程系列文章之一
XML轻松学习手册
XML入门的常见问题(一)
XML入门的常见问题(三)
XML轻松学习手册(2)XML概念