我的应用程序针对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”属性,以匹配架构的目标名称空间.