gpt4 book ai didi

java - IBM JRE : validate DOMSource with xsd doesn't work

转载 作者:行者123 更新时间:2023-11-30 03:17:40 25 4
gpt4 key购买 nike

以下代码在 oracle jre 中运行良好,但在 ibm jre 中运行不佳(尝试版本 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):

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> 没有命名空间(false)和 <comment> no 命名空间 (true) 被认为是不同的。

将代码更改为:

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

关于java - IBM JRE : validate DOMSource with xsd doesn't work,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32187365/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com