【问题标题】:How to validate an XML against schema using JAXB?如何使用 JAXB 针对模式验证 XML?
【发布时间】:2014-09-05 19:14:27
【问题描述】:

我正在使用 XMLJAXB,因为我正在将 XML 解组和编组为 Java 对象,反之亦然。现在我正在尝试根据我们的模式(test.xsd)验证我们的 XML。假设如果我的 XML 中缺少任何必填字段,那么我想知道在根据模式 test.xsd 验证 XML 之后缺少哪个字段。

public void unmarshal(final InputStream is) {
    final XMLInputFactory factory = XMLInputFactory.newInstance();
    final XMLStreamReader reader = factory.createXMLStreamReader(is);

    Object req = unmarshaller.unmarshal(reader);

    // how would I validate here?
}

我将如何根据 test.xsd 架构验证我的 XML。我的 test.xsd 架构路径是 -

C:\workspace\one\two\three\src\main\java\com\package\serv\ap\versionOne\test.xsd

更新:将 test.xsd 加载为:

Schema schema = factorySchema.newSchema(new File("C:\\workspace\\one\\two\\three\\src\\main\\java\\com\\package\\serv\\ap\\versionOne\\test.xsd"));

【问题讨论】:

    标签: java xml jaxb xsd unmarshalling


    【解决方案1】:

    您只需要在进行解组之前在Unmarshaller 上设置javax.xml.validation.Schema 的实例。您可以在Unmarshaller 上指定ValidationEventHandler 的实现,以捕获解组过程中出现的任何问题。

    更多信息

    我已经在我的博客上写了更多关于这个用例的文章:

    【讨论】:

    • 谢谢Blaise,这确实是一个有用的信息。我有一个快速的问题,在加载 test.xsd 时,我现在给出的路径是绝对的,我不确定如何设置相对路径才能加载它。这方面的任何事情都会很棒。更新了我关于相同的问题
    • @akiiddweeber - 您应该能够使用相对路径。您只需要确保该路径与您的 Java VM 认为的工作目录相关。
    • 谢谢,是的,这是正确的,所以在我的问题中更新了,如果那是我的绝对路径,我应该如何找出 intelliJ 中的相对路径 :( 通常它确实从资源中挑选,但我一无所知为什么它不从那里捡起它(相对):(
    • @akiiddweeber - 您也可以使用ClassLoader 将其作为资源(从类路径)获取。通常,当我需要从相对路径中获取某些内容并且我不知道工作目录时,我会指定我的最佳猜测,然后根据通常包含完整路径的错误,我找出我的相对路径应该是什么。 IDE 通常还提供一个配置设置来指定您想要的工作目录。
    • 谢谢@Blaise 有点用,我只是做了以下操作:Schema schema = factorySchema.newSchema(this.getClass().getResource("//test.xsd")); 并将single-slash operator 更改为double- 奇怪但有点工作,仍在测试但看起来它已修复:)
    猜你喜欢
    • 2014-06-10
    • 1970-01-01
    • 1970-01-01
    • 2011-02-07
    • 2014-07-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多