【问题标题】:How to format the XML schema validation error message in Java?如何在 Java 中格式化 XML 模式验证错误消息?
【发布时间】:2015-07-07 06:09:01
【问题描述】:

我希望在针对其架构验证 xml 文件时打印的默认错误消息设置为特定格式。

  1. 我不希望 架构错误代码 包含在错误消息中。即 cvc-complex-type-2-4-b、cvc-mininclusive-valid 等,

  2. 我不希望在错误消息中打印 命名空间。例如,需要 '{"http://sample.org/xml_schema":schema_version}' 之一。 注意 - XML 和 XSD 使用命名空间。

例如,

默认错误信息:

“cvc-complex-type.2.4.a:发现以元素“report_version”开头的无效内容。应为“{”http://sample.org/xml_schema“:schema_version}”之一。”

预期的错误信息:

“发现以元素“report_version”开头的无效内容。应为“{schema_version}”之一。”

代码:

DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
factory.setNamespaceAware(true);

try {
    SchemaFactory sf = SchemaFactory.newInstance(XMLConstants.W3C_XML_SCHEMA_NS_URI);
    Schema schema    = sf.newSchema(ClassLoader.getSystemResource("sample_schema.xsd"));
    factory.setSchema(schema);

    DocumentBuilder builder  = factory.newDocumentBuilder();
    builder.setErrorHandler(new ErrorHandler() {

            @Override
            public void warning(SAXParseException exception) {
                System.out.println(exception.getMessage());
            }

            @Override
            public void fatalError(SAXParseException exception) throws SAXException {
                System.out.println(exception.getMessage());
            }

            @Override
            public void error(SAXParseException exception) {
                System.out.println(exception.getMessage());
            }
        });

    doc   = builder.parse(inputSource);
} catch(Exception e) {

}

如果有办法实现这一点,请告诉我。

【问题讨论】:

  • 您使用特定的实现还是希望它是可移植的?
  • @SpaceTrucker - 我不需要它是便携的。

标签: java xml validation domparser saxparseexception


【解决方案1】:

我认为不可能覆盖 Expception 本身(除了可能从它派生并以某种方式覆盖 throw 函数,但是嗯......)。因为getMessage()返回一个String(可能是null?),打印前可以尝试自己格式化。

有两个':',所以你可以把第一个':'前面的所有东西都剪掉,你也可以把“”:之间的所有东西都扔到垃圾箱里,就你发布的消息而言。记住这一点,我不确定所有 SaxParseException 是否看起来像这样,你应该试一试。

理念集:

StringBuilder b = exception.getMessage();
b.delete(0, b.indexOf(":"));
b.replace(b.indexOf("{"), b.indexOf("":"), "{"); (you maybe must excape the " with \)
System.out.println(b.toString());

希望对您有所帮助,欢迎随时提问。

【讨论】:

  • 这样的问题是,并不是所有的错误信息在前面都有一个架构错误代码(即 cvc-complex-type.2.4.a: etc., )。有些消息前面没有错误代码,但可能包含冒号作为异常消息的一部分。因此,我需要知道第一个冒号之前的文本是错误代码,然后才能截断错误代码前缀并格式化消息。
  • 你能在 GH 上分享你的项目吗?因为它更容易帮助:) 或运行摘录?
猜你喜欢
  • 1970-01-01
  • 2016-05-24
  • 1970-01-01
  • 2017-12-28
  • 2021-08-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多