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();
以下代码在 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();