我的应用程序根据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文件并在我(重新)打开并验证它之前删除该属性。但必须有更好的解决方案。
我该如何处理?
答案 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.