【问题标题】:How to ignore Unexpected element situation in JAXB?如何忽略 JAXB 中的意外元素情况?
【发布时间】:2008-12-12 11:33:55
【问题描述】:

如何忽略 JAXB 中的意外元素情况仍然会得到所有其他类型的 javax.xml.bind.UnmarshalException?

obj = unmler.unmarshal(new StringReader(xml))

注意我还是想得到xml解析的obj结果。

【问题讨论】:

    标签: xml jaxb


    【解决方案1】:

    解决办法。

    在 JAXB 中像这样实现 ValidationEventHandler:

    class CustomValidationEventHandler implements ValidationEventHandler{
    
        public boolean handleEvent(ValidationEvent evt) {
            System.out.println("Event Info: "+evt);
            if(evt.getMessage().contains("Unexpected element"))
                return true;
            return false;
        }
    
    }
    

    然后

    Unmarshaller u = ...;
    
    u.setEventHandler(new CustomValidationEventHandler());
    
    u.unmarshal(new StringReader(xml));
    

    【讨论】:

    • 在我的情况下“if(evt.getMessage().contains("Unexpected element"))”应该是“if(evt.getMessage().toLowerCase().contains("unexpected element" ))”。我不知道为什么,但事件的消息有时会变成小写。
    • 当心 - 错误消息是可本地化的(取决于Locale.getDefaultLocale())!!例如,Locale.GERMAN 是“unerwartetes 元素”。
    【解决方案2】:

    此外,JAXB 2.0 会自动忽略无法识别的元素并继续解组过程。请参阅https://jaxb.java.net/nonav/jaxb20-fcs/docs/api/javax/xml/bind/Unmarshaller.html 并跳转到“验证和格式良好”。

    【讨论】:

      【解决方案3】:

      使用JAXB.unmarshal(),默认情况下会忽略意外元素。请小心,因为它也会跳过架构验证。

      Java 文档: https://docs.oracle.com/javase/8/docs/api/javax/xml/bind/JAXB.html

      【讨论】:

        猜你喜欢
        • 2011-06-29
        • 2021-11-20
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-05-15
        • 1970-01-01
        • 1970-01-01
        • 2011-09-28
        相关资源
        最近更新 更多