前言:
  也是在实际工作中, 借助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的性能优化, 以及内部的实现机制多多深入研究一下.

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

  1. xml报文解析和组装

    package com.xjts.cipher.util;import java.io.File;import java.io.FileWriter;import java.io.IOExceptio ...

  2. 使用JAXB读写xml

    1.注解 在Java模型中的创建与 xml 文件对应的节点和属性需要用注解来表示 @XmlRootElement 作用:将一个Java类映射为一段XML的根节点参数:    name  定义这个根节点 ...

  3. Java开发笔记(一百零九)XML报文的定义和解析

    前面介绍了JSON格式的报文解析,虽然json串短小精悍,也能有效表达层次结构,但是每个元素只能找到对应的元素值,不能体现更丰富的样式特征.比如某个元素除了要传输它的字符串文本,还想传输该文本的类型. ...

  4. 接口中的xml报文和实体类的之间转换

    需求:湖南保险行业意健险承保风险预警平台数据接口 平台提供HTTPServlet服务,接受保险公司的数据请求,并在处理后返回给保险公司相应的处理结果.数据接口格式为XML数据报文,在每次接口的交易中, ...

  5. JAXB读写xml

    一.注解 在Java模型中的创建与 xml 文件对应的节点和属性需要用注解来表示 @XmlRootElement 作用:将一个Java类映射为一段XML的根节点参数:    name  定义这个根节点 ...

  6. xml报文的装配解析

    xstream dom 将map自动转化为xml报文 http://blog.csdn.net/lisheng19870305/article/details/45847985 报文的通信

  7. 上传文件时,Request报文头不同浏览器会产生不同的content-type

    选择一个zip文件上传,用IE看的报文头是image/jpeg,用chrom看是application/octet-stream. 第一次遇到这个类型的content-type,百度了一下, octe ...

  8. 自己动手学TCP/IP–http协议(http报文头)

    在前面的一篇文章中,简单了介绍了HTTP报文格式,详情参考http://www.firefoxbug.net/?cat=47. 这里大概介绍下基本的,常见的HTTP包头格式. POST /report ...

  9. TCP/IP协议族(二) HTTP报文头解析

    本篇博客我们就来详细的聊一下HTTP协议的常用头部字段,当然我们将其分为请求头和响应头进行阐述.下方是报文头每个字段的格式,首先是头部字段的名称,如Accept,冒号后方紧跟的是该字段名所对应的值,每 ...

随机推荐

  1. GitHub 简单用法

    1. GitHub账号的申请 首先打开Github主页,https://github.com 如果你没有登录过的话会打开如下图的界面(登录过你就不用看这段了), 注册画面如下: 注意右侧不是登陆界面而 ...

  2. P标签莫名有了margin-top值的原因

    p标签默认 -webkit-margin-after: 1em; -webkit-margin-before: 1em;元素上下边距数值为1倍字体高度 设置-webkit-margin-after: ...

  3. ActiveMQ topic 普通订阅和持久订阅

    直观的结果:当生产者向 topic 发送消息, 1. 若不存在持久订阅者和在线的普通订阅者,这个消息不会保存,当普通订阅者上线后,它是收不到消息的. 2. 若存在离线的持久订阅者,broker 会为该 ...

  4. Linux/AIX/Windows端口和进程互查

    经常我们需要通过端口号查是哪个进程占用,或想查看某个进程占用了哪些端口. 1.1Linux上通过端口查找进程 比如我们想知道当前系统中80端口是哪个进程所占用 netstat -anp| |more ...

  5. OGG文件获取创建日期

    转载:http://blog.sina.com.cn/s/blog_b0ed98070102v1tr.html 搜索关键字: OGG文件的数据结构以及读取其注释信息的代码 实例说明: "DA ...

  6. Mockito:一个强大的用于Java开发的模拟测试框架

    https://blog.csdn.net/zhoudaxia/article/details/33056093 介绍 本文将介绍模拟测试框架Mockito的一些基础概念, 介绍该框架的优点,讲解应用 ...

  7. web前端开发面试题(答案)

    1.xhtml和html有什么区别? HTML是一种基本的WEB网页设计语言,XHTML是一个基于XML的置标语言最主要的不同:XHTML 元素必须被正确地嵌套.XHTML 元素必须被关闭.标签名必须 ...

  8. PAT-GPLT训练集 L2-001 紧急救援(最短路)

    PAT-GPLT训练集 L2-001 紧急救援 题目大意:求最短路的条数,最短路中的权重和的最大值和这条最短路的路线 分析:使用dijkstra算法求出最短路,并且对dijkstra算法进行变化,设起 ...

  9. Standalone的更改方式

    1.更改Game视图中的Standalone分辨率 2.在unity中菜单栏中 File---->Build Settings(Ctrl+Shift+B)---->Player Setti ...

  10. centos7 克隆 网卡无法启用

    1.克隆后查看网卡无法启用,报错信息如下: Apr :: agent systemd: network.service: control process exited, code=exited sta ...