Jaxb对xml报文头的小修小改

前言:
  也是在实际工作中, 借助jaxb来实现xml到java对象的映射转换. 在实际应用中, 也遇到了一些有趣好玩的东西, 权当记录下来.
  本文主要讲解jaxb如何生成约定的xml报文头的实现思路, 点比较小, 而且方法有点trick, 因此导致取博文标题的时候, 也有些小迷茫, ^_^.

现象:
  我们先来定义一个简单的java类, 并用于生成其对应的xml内容.

    @Getter
    @Setter
    @NoArgsConstructor
    @AllArgsConstructor
    @XmlAccessorType(XmlAccessType.FIELD)
    @XmlRootElement(name="root")
    public static class TNode {

        @XmlElement(name="key", required = true)
        private String key;

        @XmlElement(name="value", required = true)
        private String value;

    }

    public static void main(String[] args) {
        TNode obj = new TNode("key_1", "val_1");
        try {
            JAXBContext jc = JAXBContext.newInstance(TNode.class);
            Marshaller marshaller = jc.createMarshaller();
            marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
            marshaller.setProperty(Marshaller.JAXB_ENCODING, "UTF-8");

            StringWriter writer = new StringWriter();
            marshaller.marshal(obj, writer);

            System.out.println(writer.toString());
        } catch (JAXBException e) {
            e.printStackTrace();
        }
    }

  注: 这是简单的实体类, 以及对应的jaxb生成xml的代码
  具体的生成结果如下:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<root>
    <key>key_1</key>
    <value>val_1</value>
</root>

  在默认的xml报文头里, 比常见的多了一个standalone="yes" , 有没有办法去掉这个小尾巴呢?

尝试思路:
  Marshaller类定义了很多属性, 我们先来看一下有没有报文头相关的配置.

public interface Marshaller {

    // *) 指定编码模式
    public static final String JAXB_ENCODING = "jaxb.encoding";

    // *) 指定输出时, 是否支持缩进和换行
    public static final String JAXB_FORMATTED_OUTPUT = "jaxb.formatted.output";

    /**
     * The name of the property used to specify the xsi:schemaLocation
     * attribute value to place in the marshalled XML output.
     */
    public static final String JAXB_SCHEMA_LOCATION = "jaxb.schemaLocation";

    /**
     * The name of the property used to specify the
     * xsi:noNamespaceSchemaLocation attribute value to place in the marshalled
     * XML output.
     */
    public static final String JAXB_NO_NAMESPACE_SCHEMA_LOCATION
        = "jaxb.noNamespaceSchemaLocation";

    // *) 是否生成报文头
    public static final String JAXB_FRAGMENT = "jaxb.fragment";

}

  让人有点小失望, 里面涉及报文头的信息, 只有两个, JAXB_ENCODING控制编码, JAXB_FRAGMENT控制报文头的可见性, 对standalone的可见性没有配置项. 看来这条路是行不通的.

解决思路:
  本来觉得jaxb提供了一些listener是可以实现这个功能, 不过还没研究. 无意中, 看到网友写了一段输出xml的代码, 突然想到他或许也遇到了同样的问题, 只是没把为什么这样做的目的写出来.
  我们重新修改下生成xml的代码:

    public static void main(String[] args) {
        TNode obj = new TNode("key_1", "val_1");
        try {
            JAXBContext jc = JAXBContext.newInstance(TNode.class);
            Marshaller marshaller = jc.createMarshaller();
            marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
            marshaller.setProperty(Marshaller.JAXB_ENCODING, "UTF-8");
            // 1) 隐去报文头的生成, Marshaller.JAXB_FRAGMENT默认为false
            marshaller.setProperty(Marshaller.JAXB_FRAGMENT, true);

            StringWriter writer = new StringWriter();
            // 2) 自定义生成
            writer.write("<?xml version=\"1.0\" encoding=\"UTF-8\" ?>\n");
            marshaller.marshal(obj, writer);

            System.out.println(writer.toString());
        } catch (JAXBException e) {
            e.printStackTrace();
        }
    }

  注: 两个要点, 1. 激活JAXB_FRAGMENT为true, 隐去jaxb自动生成xml报文头. 2. 自定义输出报文头信息
  测试一下, 结果如下:

<?xml version="1.0" encoding="UTF-8" ?>
<root>
    <key>key_1</key>
    <value>val_1</value>
</root>

总结:
  这也算得上一篇博客水文, 这边就当学习笔记, 抛砖引玉. 后续想对jaxb的性能优化, 以及内部的实现机制多多深入研究一下.

原文地址:https://www.cnblogs.com/mumuxinfei/p/8985269.html

时间: 2024-10-12 16:20:53

Jaxb对xml报文头的小修小改的相关文章

如何导出已有的谷歌插件,又如何把导出的插件安装到360浏览器中,又如何对插件小修小改?

平台之大势何人能挡? 带着你的Net飞奔吧!:http://www.cnblogs.com/dunitian/p/4822808.html 咱们能FQ能上网当然没问题,要是你到了断网的机房又怎么利用开发利刃呢? 打开谷歌应用,注意一下id,每个产品都对应一个id,这个ID就是“C:\Users\用户名\AppData\Local\Google\Chrome\User Data\Default\Extensions”文件夹下面的目录 打包扩展程序 生成成功 到上一级目录看看,这个crx的导出文件就

webservice 报文头及返回xml

类 [Serializable] public class MySoapHeader : System.Web.Services.Protocols.SoapHeader { private string userName = string.Empty; private string passWord = string.Empty; /// <summary> /// 构造函数 /// </summary> public MySoapHeader() { } /// <sum

JAXB 实现 XML &amp; JAVABEAN 的转换

一 前言 集成接口项目的开发,与第三方系统或中间平台等进行交互,支持服务端&客户端,支持 http/ https/ Webservice 等多种交互方式,数据传输主要采用XML(部分可能会在XML中以<![CDATA[......]]> 的形式包裹 JSON字符串),以后也可能会采用 JSON 格式.鉴于功能需要,必然要将XML传输的数据转换为JAVA对象来进行数据的处理,以及将JAVA对象转换为XML作为报文进行传输,因此,给出以下方案:利用JAXB技术来实现JAVA对象与XML的自

使用JAXB读写xml

1.注解 在Java模型中的创建与 xml 文件对应的节点和属性需要用注解来表示 @XmlRootElement 作用:将一个Java类映射为一段XML的根节点参数:    name  定义这个根节点的名称    namespace   定义这个根节点命名空间@XmlAccessorType  作用:定义映射这个类中的何种类型需要映射到XML.可接收四个参数,分别是:    XmlAccessType.FIELD:表示将这个类中的 非静态(static).非序列化(transient)属性映射到

HTTP报文头解析

HTTP报文头解析 本篇博客我们就来详细的聊一下HTTP协议的常用头部字段,当然我们将其分为请求头和响应头进行阐述.下方是报文头每个字段的格式,首先是头部字段的名称,如Accept,冒号后方紧跟的是该字段名所对应的值,每个值之间有逗号分隔.如果该值需要优先级,那么在值的后方跟上优先级q=0.8(q的值由0~1,优先级从低到高).值与优先级中间由分号相隔. 头部字段名:值1, 值2;q=0.8 下方就是截取的网络请求中Request Headers的部分内容.红框中的Accept-Language

使用wireshark分析tcp/ip报文之报文头

以太网报文的结构如下: 其中,以太网的帧头: 14 Bytes:MAC目的地址48bit(6B),MAC源地址48bit(6B),Type域2B,一共14B. IP头部: TCP头部: http://blog.163.com/[email protected]/blog/static/618945432011101110497885/ http://www.cnblogs.com/zhuzhu2016/p/5797534.html 也就是报文的头部一共有54字节.下面以一个简单的http请求查看

eclipse下java中注释字体太小和xml中中文字体太小问题解决方法

我们在win7下进行android应用开发,需要搭建相应的开发环境.现在普遍基本上都是eclipse+adt+sdk,在本人搭建完环境后,发现eclipse下,java中的注释和xml中的中文字体变得特别小,无法看的清楚.解决方法如下: 1.Java中字体变大方法: 打开eclipse,Window-->Preferences,如下图打开: 双击第二个红色框,如下图: 将字体改成五号即可. 2.xml中中文字体太小解决方法: 打开eclipse,Window-->Preferences--&g

JAXB完成XML与Java对象的互转

这段时间都老忙了,甚至连周末所有人员都在赶产品的进度,想想连续上12天班,人都有点晕了!到这会儿终于有点时间,所以准备和大家分享一下JAXB,会不会有人觉得有点陌生呢?没事,这里跟大伙儿简单的描述一下: JAXB(Java Architecture for XML Binding) 是一个业界的标准,是一项可以根据XML Schema产生Java类的技术.该过程中,JAXB也提供了将XML实例文档反向生成Java对象树的方法,并能将Java对象树的内容重新写到XML实例文档.从另一方面来讲,JA

ClistCtrl用法及总结(由怎样隐藏ListCtrl列表头的排序小三角形这个bug学习到的知识)

1 怎样隐藏ListCtrl列表头的排序小三角形 在创建控件是加入|LVS_NOSORTHEADER风格即可. 一下是用法总结: 本文根据本人在项目中的应用,来谈谈CListCtrl的部分用法及技巧.当初学习时,查了很多资料,零零碎碎的作了些记录,现在主要是来做个总结,方便以后查阅.主要包括以下十三点内容:基本操作.获取选中行的行号.复选框操作.动态设置选中行的字体颜色.设置选中行的背景颜色.禁止拖动表头.让第一列居中显示.设置行高与字体.虚拟列表技术.点击表头时进行归类.向上与向下移动.动态调