当前位置: 首页 > news >正文

JAXB复杂对象反序列化

记录一次jaxb反序列化的使用,只是简单快速上手使用

一、xml文本

<InputProxyChannelStatusList version="1.0" xmlns="http://www.std-cgi.com/ver20/XMLSchema">
   <InputProxyChannelStatus version="1.0">
       <id>6</id>
       <sourceInputPortDescriptor>
           <proxyProtocol>HIKVISION</proxyProtocol>
           <addressingFormatType>ipaddress</addressingFormatType>
           <ipAddress>11</ipAddress>
           <managePortNo>11</managePortNo>
           <srcInputPort>1</srcInputPort>
           <userName>11</userName>
           <cameraType>none</cameraType>
           <streamType>auto</streamType>
           <deviceID></deviceID>
       </sourceInputPortDescriptor>
       <online>true</online>
   </InputProxyChannelStatus>
   <InputProxyChannelStatus version="1.0">
       <id>8</id>
       <sourceInputPortDescriptor>
           <proxyProtocol>HIKVISION</proxyProtocol>
           <addressingFormatType>ipaddress</addressingFormatType>
           <ipAddress>11</ipAddress>
           <managePortNo>11</managePortNo>
           <srcInputPort>1</srcInputPort>
           <userName>11</userName>
           <cameraType>none</cameraType>
           <streamType>auto</streamType>
           <deviceID></deviceID>
       </sourceInputPortDescriptor>
       <online>true</online>
   </InputProxyChannelStatus>
</InputProxyChannelStatusList>

二、对应的java对象

根据xml内容的层次关系定义对象

  • InputProxyChannelStatusListDTO
@Data
@XmlAccessorType(XmlAccessType.FIELD)
@XmlRootElement(name = "InputProxyChannelStatusList",namespace = "http://www.std-cgi.com/ver20/XMLSchema")
public class InputProxyChannelStatusListDTO implements Serializable {


    @XmlAttribute
    private String version;

    @XmlElement(name = "InputProxyChannelStatus", namespace = "http://www.std-cgi.com/ver20/XMLSchema")
    private List<InputProxyChannelStatusDTO> InputProxyChannelStatus;

}
  • InputProxyChannelStatusDTO
@Data
@XmlAccessorType(XmlAccessType.FIELD)
public class InputProxyChannelStatusDTO implements Serializable {


    @XmlAttribute
    private String version;

    @XmlElement(name = "id",namespace = "http://www.std-cgi.com/ver20/XMLSchema")
    private Integer id;
    @XmlElement(name = "sourceInputPortDescriptor",namespace = "http://www.std-cgi.com/ver20/XMLSchema")
    private SourceInputPortDescriptorDTO sourceInputPortDescriptor;
    @XmlElement(name = "online",namespace = "http://www.std-cgi.com/ver20/XMLSchema")
    private boolean online;


}
  • SourceInputPortDescriptorDTO
@Data
@XmlAccessorType(XmlAccessType.FIELD)
public class SourceInputPortDescriptorDTO implements Serializable {


    @XmlElement(name = "proxyProtocol", namespace = "http://www.std-cgi.com/ver20/XMLSchema")
    private String proxyProtocol;
    @XmlElement(name = "addressingFormatType", namespace = "http://www.std-cgi.com/ver20/XMLSchema")
    private String addressingFormatType;
    @XmlElement(name = "ipAddress", namespace = "http://www.std-cgi.com/ver20/XMLSchema")
    private String ipAddress;
    @XmlElement(name = "managePortNo", namespace = "http://www.std-cgi.com/ver20/XMLSchema")
    private int managePortNo;
    @XmlElement(name = "srcInputPort", namespace = "http://www.std-cgi.com/ver20/XMLSchema")
    private int srcInputPort;
    @XmlElement(name = "userName", namespace = "http://www.std-cgi.com/ver20/XMLSchema")
    private String userName;
    @XmlElement(name = "cameraType", namespace = "http://www.std-cgi.com/ver20/XMLSchema")
    private String cameraType;
    @XmlElement(name = "streamType", namespace = "http://www.std-cgi.com/ver20/XMLSchema")
    private String streamType;
    @XmlElement(name = "deviceID", namespace = "http://www.std-cgi.com/ver20/XMLSchema")
    private String deviceID;
}

三、序列化和反序列代码

    public static void main(String[] args) throws Exception{
        String xmlStr="";
        final JAXBContext jaxbContext = JAXBContext.newInstance(InputProxyChannelStatusListDTO.class);
        final Unmarshaller unmarshaller = jaxbContext.createUnmarshaller();
        final StringReader stringReader = new StringReader(xmlStr);


        final InputProxyChannelStatusListDTO unmarshal = (InputProxyChannelStatusListDTO)unmarshaller.unmarshal(stringReader);

        System.out.println(unmarshal);

        final StringWriter stringWriter = new StringWriter();
        final Marshaller marshaller = jaxbContext.createMarshaller();
        //格式化
        marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
        //编码
        marshaller.setProperty(Marshaller.JAXB_ENCODING, "UTF-8");
        //是否省略xml头信息
        marshaller.setProperty(Marshaller.JAXB_FRAGMENT, false); 
        marshaller.marshal(unmarshal, stringWriter);


        System.out.println(stringWriter.toString());

    }

四、注意要点

1、相信发现了,有个地方特别繁琐,就是每个元素的命名空间,在我使用的版本里边,每个元素都必须写上 namespace = “”,如果根节点不写会报错
意外的元素 (uri:"http://www.std-cgi.com/ver20/XMLSchema", local:"InputProxyChannelStatusList")。所需元素为<{}InputProxyChannelStatusList>
节点元素不写返回的值就是空,目前没有去深究,有些教程上边用的时全局处理注解,这里懒得处理,先用着。
2、另外就是jdk1.8带有jaxb,后续版本可能需要引入依赖,自己选择依赖版本,这里先展示一个,如果有问题可以自行查找可用依赖

<dependency>
    <groupId>javax.xml.bind</groupId>
    <artifactId>jaxb-api</artifactId>
    <version>2.3.1</version>
</dependency>
<dependency>
    <groupId>org.glassfish.jaxb</groupId>
    <artifactId>jaxb-runtime</artifactId>
    <version>2.3.1</version>
</dependency>

相关文章:

  • 计算机视觉:神经网络实战之手势识别(附代码)
  • 前端插件使用xlsx-populate,花样配置excel内容,根据坐添加标替换excel内容,修改颜色,合并单元格...。
  • 个人shell脚本分享
  • spring如何解决循环依赖的问题
  • 讯方·智汇云校华为官方授权培训机构
  • 突破反爬困境:从服务端渲染到客户端SPA,爬虫环境的演变与新挑战(一)
  • Linux(Centos 7.6)命令详解:cat
  • LeetCode47
  • 【ISO 14229-1:2023 UDS诊断(会话控制0x10服务)测试用例CAPL代码全解析⑩】
  • AI服务器散热黑科技:让芯片“冷静”提速
  • linux网络编程(1.5w字+内部程序理解网络)
  • 7-Zip Final绿色版:高效压缩解压缩工具
  • 机器学些|实战?
  • 基于Java+SpringBoot+Vue的前后端分离的校园闲置物品交易网站
  • [Windows] Win7也能控制安卓手机屏幕(手机镜像投屏):scrcpy
  • PhotoShop批处理
  • Redis7——基础篇(三)
  • 3分钟了解内外网文件传输:常见方法、注意事项有哪些?
  • 【Scrapy】Scrapy教程5——第一个Scrapy项目
  • LeetCode 2080.区间内查询数字的频率:哈希表+二分查找
  • 宋涛就许历农逝世向其家属致唁电
  • 媒体:不能让追求升学率,成为高中不双休的借口
  • “五一”假期客流增加,多地提升铁路运力并强化服务
  • 大一女生头孢过敏输液室呼救无医护响应,自行拔针仍不幸身亡
  • 经常犯困、迷糊……当心是身体发出的“黄牌”警告
  • 武契奇目前健康状况稳定,短期内将暂停日常工作