当前位置: 首页 > 面试题库 >

如何针对xsd验证xml并获取* ALL *错误?

段干高歌
2023-03-14
问题内容

我有一个像下面这样的标准代码,可以针对xsd验证xml,但是它会在第一个错误时引发异常并停止。如何验证xml,但继续出现第一个和下一个错误,并在最后获得所有错误?可能吗?

public static void validate(File xml, InputStream xsd) {
    try {
        SchemaFactory factory = SchemaFactory.newInstance(XMLConstants.W3C_XML_SCHEMA_NS_URI);
        Schema schema = factory.newSchema(new StreamSource(xsd));
        Validator validator = schema.newValidator();
        StreamSource xmlFile = new StreamSource(xml);
        validator.validate(xmlFile);

    } catch (SAXException e) {
        e.printStackTrace();
    } catch (IOException e) {
        e.printStackTrace();
    }
}

问题答案:

Validator validator = schema.newValidator();和之间StreamSource xmlFile = new StreamSource(xml);添加此片段:

  final List<SAXParseException> exceptions = new LinkedList<SAXParseException>();
  validator.setErrorHandler(new ErrorHandler()
  {
    @Override
    public void warning(SAXParseException exception) throws SAXException
    {
      exceptions.add(exception);
    }

    @Override
    public void fatalError(SAXParseException exception) throws SAXException
    {
      exceptions.add(exception);
    }

    @Override
    public void error(SAXParseException exception) throws SAXException
    {
      exceptions.add(exception);
    }
  });

这样,validate()您将获得完整的异常列表之后,但是如果发生一个致命错误,则分析将停止…

编辑:JavaDoc说: _应用程序必须假定解析器调用此方法后该文档不可用,并且仅应出于收集其他错误消息的目的而继续(如果有的话):实际上,
SAX解析器可以自由停止 调用此方法后, 报告其他事件 。_因此fatalError()可能会或可能不会导致解析停止。



 类似资料:
  • 问题内容: 我需要使用给定的XSD文件验证XML文件。我只需要如果验证正常就返回true,否则返回false的方法。 问题答案: 仅返回true或false(也不需要任何外部库):

  • 问题内容: 如何使用Java中的XSD验证XML文件?我们事先不知道架构。我希望能够获得,下载XSD,对其进行缓存,然后执行实际的验证。 问题是,使用/ 类,我似乎无法提前掌握。这有什么窍门?我应该学习哪些课程? 也许我可以使用更合适的API?整个问题是,我们需要动态验证,而不必(必需)在本地拥有XSD。 如何获得XSD文件中定义的URL ? 我知道您可以设置功能/属性,但这是另一回事。我需要先从

  • 我需要针对给定的XSD文件验证多个XML文件。问题是XSD由两个文件组成。它们是嵌套的,尽管我知道哪个是第一个(其他文件的“父”)。在XML文件中,我使用命名空间来定义子节点在哪个XSD中定义

  • 我是XSD新手,不知道为什么我的XSD没有进行验证。我收到以下错误: s4s-elt-无效-内容.1:“参数信息”的内容无效。元素“复杂类型”无效、放错位置或出现过于频繁。 cvc复合型。2.4。d: 发现以元素“exception”开头的无效内容。此时不需要任何子元素。 XML: XSD: 我错过了什么吗?我想通过使用复杂类型并引用它们来分解它,从而使其更容易...

  • 我有一个servlet,它使用打包在.jar存档中的实用程序: 此实用工具获取xml文件流,针对xsd模式执行验证并解析它: xsd文件以: xml文件: Servlet Init方法抛出异常: 如何指定SAXParser在哪里需要xsd模式来验证xml文件? 附注。对不起,我的英语不好 UPD: 我正在尝试添加此属性: UPD2:在xml文件中使用“classpath:appcontext.xs

  • 问题内容: 但是,这将返回一条错误消息:线程“ main”中的异常java.lang.IllegalArgumentException:无法加载实现由http://www.w3.org/2001/XMLSchema -instance 指定的模式语言的SchemaFactory。 这是我的代码还是实际的xsd文件有问题? 问题答案: 该错误意味着您安装的Java没有任何可解析XMLSchema文件