当前位置: 首页 > 知识库问答 >
问题:

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

佴普松
2023-03-14

我正在根据架构验证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"));

失败时的异常消息:无法针对架构SamplerEsponse.xsd验证。嵌套异常:src-resolve:无法将名称“oa:attachments”解析为(n)个“element declaration”组件

共有1个答案

黄仲渊
2023-03-14

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

StreamSource(InputStream inputStream, String systemId)

尝试将systemId设置为:null,包含架构的文件,其他文件,一个不存在的文件。这可能会给您一个提示,说明验证器正在对SystemID进行什么操作。

 类似资料:
  • 我可以接收82个XML结构中的一个,每个结构都包含一个不在名称空间中的根,还包含几个xmlns属性,其中第一个属性为对象的模式定义一个urn,其余的(定义名称空间)也包含公共对象的urn。 Java中的模式感知解析假设您在开始解析之前知道该模式,但我不知道它,直到我在未经验证的情况下加载了XML并提取了根,此时我可以使用正确的模式再次加载它,或者,我可以找到一些方法来访问根目录中的xmlns元素,

  • 问题内容: 任何人都知道为什么该命令在Windows中可以正常工作,但是在Linux中,我得到了ClassNotFoundException game.ui.Main 我的文件夹结构如下:lib /-Jars游戏/-类文件 这是最新的Java 6。 问题答案: 类路径语法与操作系统有关。来自维基百科: 命令行Classpath语法与文件系统密切相关,取决于操作系统。例如: 在所有类似Unix的操作

  • 我有一个jsf表单,它包括p: autoCompelete字段。给你; 表单中有3个验证。它们是“必需=真”。此外,它们位于p:自动完成字段中。 所以,问题是,当我在没有输入的情况下单击“保存按钮”时,验证工作正常。然而,当我只在一个p:autocomplete字段中输入,然后单击“保存”按钮时,primefaces验证不起作用,我得到了java错误。我的意思是,由于另外两个必填字段为空,我希望得

  • 这里是我的pom.xml 4.0.0 org.springframework.Boot spring-boot-starter-parent 2.3.2.release com.king Gestpeacesecurity 0.0.1-snapshot Gestpeacesecurity用于Spring Boot的和平安全项目 我的实体代理,我使用lomback作为getter和setter 这是

  • 嗨,我想用提交按钮验证输入类型=电子邮件字段。我在页面中有两个表单元素。我正在打开一个div(divForgotPassword)作为模式。但是必需的属性在模态内部不起作用。下面是我的代码 //一些元素

  • 我想测试用户是否在模式 ##-#- 中输入了任何字符或数字#### 我的表达式是 ^(\w){4}-(\w){2}-(\w){3}-(\w){4}$,似乎在联机测试人员中有效,但在我的验证表达式中不起作用! 有什么想法吗? 这是我的代码(getComponentValye是我自己获取值的函数)…