微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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”属性,以匹配架构的目标名称空间.

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。