【问题标题】:Can not parse xml root element use jackson无法解析xml根元素使用jackson
【发布时间】:2023-03-13 04:35:01
【问题描述】:

测试豆

@JacksonXmlRootElement(localName = "DATA_RECORD")
public class TestBean{
    @JacksonXmlProperty(localName="ERROR_MESSAGE_CODE")
    private String error_message_code;
    @JacksonXmlProperty(localName="ERROR_MESSAGE")
    private String error_message;
    //...getter/setter
}

XML 示例

String xml = "<?xml version=\"1.0\" encoding=\"Windows-31J\" standalone=\"no\"?>"
            + "<Message xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" "
            //+">"
            + "xsi:noNamespaceSchemaLocation=\"TEST.xsd\">" // if comment out this,it will work.
            + "<DATA_RECORD>"
            + "<ERROR_MESSAGE>some message</ERROR_MESSAGE>"
            + "<ERROR_MESSAGE_CODE>CODE111</ERROR_MESSAGE_CODE>"
            + "</DATA_RECORD>"
            + "</Message>";

反序列化

XmlMapper xmlMapper = new XmlMapper();
//xmlMapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
xmlMapper.configure(DeserializationFeature.UNWRAP_ROOT_VALUE, true);
TestBean test = xmlMapper.readValue(xml, TestBean.class);
log.debug(test.toString());

我从 Junit 运行它,我得到如下异常:

根名称“noNamespaceSchemaLocation”与预期不匹配 ('DATA_RECORD') ....

如果我从String xml 中删除xsi:noNamespaceSchemaLocation="TEST.xsd",它将正常工作。

对此有想法吗?感谢您的帮助。

【问题讨论】:

    标签: java xml jackson jackson-dataformat-xml


    【解决方案1】:

    根据docs,当你指定UNWRAP_ROOT_VALUE时,Jackson(这里是XML而不是JSON)

    将验证根 JSON 值是否为 JSON 对象,并且它具有 具有预期根名称的单个属性。如果没有,一个 抛出 JsonMappingException;

    在这种情况下,根 Message 具有除 DATA_RECORD 之外的另一个属性,名称为 noNamespaceSchemaLocation 和指定的 JsonMappingException 的 XML 属性被抛出。

    恐怕您将不得不解析Message 并从那里获取TestBean。例如:

    @JacksonXmlRootElement
    class Message {
        @JacksonXmlProperty(localName = "DATA_RECORD")
        private TestBean dataRecord;
    }
    
    class TestBean {
        @JacksonXmlProperty(localName = "ERROR_MESSAGE_CODE")
        private String error_message_code;
        @JacksonXmlProperty(localName = "ERROR_MESSAGE")
        private String error_message;
    }
    

    xmlMapper.disable(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES);
    Message test = xmlMapper.readValue(xml, Message.class);
    log.debug(test.getDataRecord().toString());
    

    【讨论】:

    • 感谢您的帮助。它有效!!所以我不能像将 作为根元素而不是 那样部分解析 xml?
    猜你喜欢
    • 2019-01-31
    • 2021-09-19
    • 2020-12-11
    • 2013-07-10
    • 2017-11-21
    • 2014-02-27
    • 1970-01-01
    • 2014-12-24
    • 1970-01-01
    相关资源
    最近更新 更多