IBM JRE:使用 xsd 验证 DOMSource 不起作用

IBM JRE : validate DOMSource with xsd doesn't work

以下代码在 oracle jre 中运行良好但在 ibm 中运行不正常(尝试版本 5、6 和 7)。该代码只是针对 xsd.

验证了一些 xml

这是一个已知错误吗?是否有魔法 属性 或功能可以设置?

public static void main(String[] args) throws Exception {
    String xsd = "<xsd:schema xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\">"+
                    "<xsd:element name=\"comment\" type=\"xsd:string\"/>" +
                "</xsd:schema>";
    String xml = "<comment>test</comment>";

    DocumentBuilder builder = DocumentBuilderFactory.newInstance().newDocumentBuilder();
    Document document = builder.parse(new InputSource(new StringReader(xml)));

    SchemaFactory sf = SchemaFactory.newInstance(XMLConstants.W3C_XML_SCHEMA_NS_URI); 
    Schema schema = sf.newSchema( new StreamSource(new StringReader(xsd))); 
    Validator validator = schema.newValidator();
    Source source = new DOMSource(document);
    validator.validate(source);
    System.out.println("ok");
}

异常:

Exception in thread "main" org.xml.sax.SAXParseException: cvc-elt.1: Cannot find the declaration of element 'comment'.
    at org.apache.xerces.util.ErrorHandlerWrapper.createSAXParseException(Unknown Source)
    at org.apache.xerces.util.ErrorHandlerWrapper.error(Unknown Source)

如果我将我的文档转换为字符串并使用 StreamSource,我可以绕过这个错误。但我想直接验证文档。这个示例再简单不过了,应该可以在 IBM JRE 上运行,不是吗?

您需要致电DocumentBuilderFactory.setNamespaceAware(true)

这是必要的,因为您使用的是基于命名空间的 XML 架构,甚至 没有命名空间 url。 Oracle JRE 显然是宽松的并且在没有该属性的情况下支持它,而 IBM JRE 更严格一些,即 <comment> without a namespace (false) and <comment>no 命名空间 (true) 被认为是不同的。

将您的代码更改为:

DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
factory.setNamespaceAware(true);
DocumentBuilder builder = factory.newDocumentBuilder();