gpt4 book ai didi

当模式来自类路径时,Java XML 验证不起作用

转载 作者:塔克拉玛干 更新时间:2023-11-03 05:18:35 24 4
gpt4 key购买 nike

我正在根据模式验证 XML 文档。一些更复杂的文档/模式在尝试使用此代码验证它们时总是失败:

    DocumentBuilderFactory dbfac = DocumentBuilderFactory.newInstance();
dbfac.setNamespaceAware(true);
dbfac.setIgnoringElementContentWhitespace(true);
DocumentBuilder docBuilder = dbfac.newDocumentBuilder();
Document doc = docBuilder.parse("sampleResponse.xml");

SchemaFactory schemaFactory = SchemaFactory.newInstance(XMLConstants.W3C_XML_SCHEMA_NS_URI);
Source schemaSource = new StreamSource(getClass().getResourceAsStream("/" + "SampleResponse.xsd"));

Schema schema = schemaFactory.newSchema(schemaSource);
Validator validator = schema.newValidator();
Source source = new DOMSource(doc);
// Set a custom error handler that simple re-throws every exception
validator.setErrorHandler(new ValidationErrorHandler());
validator.validate(source);

问题是这一行:

    Source schemaSource = new StreamSource(getClass().getResourceAsStream("/" + "SampleResponse.xsd"));

如果我将架构作为文件读取,它会起作用:

    Source schemaSource = new StreamSource(new File("somepath/SampleResponse.xsd"));

当我直接从类路径获取架构时,为什么验证不起作用?

(在 Windows 7 64 位上使用 Java 1.6)

失败时的异常信息:无法根据架构 SampleResponse.xsd 进行验证。嵌套异常:src-resolve:无法将名称“oa:Attachments”解析为 (n)“元素声明”组件。

最佳答案

当您将文件传递给 StreamSource 时,InputStream 被设置为文件的内容,而且 systemId 也被设置为文件的 URL。这允许解析模式中的相对 URI。如果您的架构有任何相对 URL,这绝对是您的问题。要在从类路径读取架构时使这些相对 URL 可解析,您需要实现 EntityResolver .如果您不使用相对 URI,则 systemId 为 null 可能仍会产生其他更微妙的影响。我建议使用构造函数

StreamSource(InputStream inputStream, String systemId)

尝试将 systemId 设置为:null,包含模式的文件,一些其他文件,一个不存在的文件。这可能会给您一些提示,让您了解 Validator 使用 systemId 做了什么。

关于当模式来自类路径时,Java XML 验证不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10997453/

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