1

我希望在针对其架构验证 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) {

}

让我知道是否有办法实现这一目标。

4

1 回答 1

0

我认为不可能覆盖 Expception 本身(除了可能从它派生并以某种方式覆盖 throw 函数,但是嗯......)。因为 getMessage() 返回一个字符串(可能为 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());

希望这会有所帮助,请随时询问。

于 2015-07-14T06:40:39.353 回答