前言:
  也是在实际工作中, 借助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默认为falsemarshaller.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

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

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

    平台之大势何人能挡? 带着你的Net飞奔吧!:http://www.cnblogs.com/dunitian/p/4822808.html 逆天常用的一些谷歌浏览器插件 http://www.cnbl ...

  2. FCOSv2:原作的扩展版本,小修小改,性能高达50.4AP | IEEE T-PAMI 2020

    本文是对FCOS的小修小改,最终性能达到了50.4AP,可谓相当强劲了,大家在工程上可以参考其中的改进以及提升方法   来源:晓飞的算法工程笔记 公众号 论文: FCOS: A Simple and ...

  3. idea 新建/导入的xml 报文头报错 URI is not registered (Settings | Languages Frameworks | Schemas and DTDs)...

    我们在新创建项目或是新添加xml文件时,项目会出现xmlns变红色 解决方法如下: 1.粘贴报错的地址,打开idea  Settings ->Languages & Frameworks ...

  4. 3D版CenterNet: CenterPoint,小修小改也能刷爆榜单

    点击上方"3D视觉工坊",选择"星标" 干货第一时间送达 导言 最近3d目标检测领域出了一篇新作,思路简单,却在nuScenes榜单上高居第二.正式讲解它之前, ...

  5. java xmladapte_三步解决JAXB生成XML包含CDATA问题—JAVA编程

    废话不多说,写此文档的目的就是为了帮助java开发者,解决利用JAXB生成XML时,XML中带有CDATA问题. 分三步走: 首先创建适配器类:CDataAdapter.java package co ...

  6. python发送xml报文_python通过tcp发送xml报文的方法

    如下所示: # -*- coding: utf-8 -*- import socket # 使用tcp发送请求报文 def tcpsend(ip, port, xmlbw): address = (i ...

  7. JAXB实现xml与对象互相转换

    不需要引入任何外部jar包,JAXB自jdk1.5就已被集成,jdk1.7已升级为JAXB2. 1.xml报文 <?xml version="1.0" encoding=&q ...

  8. JAXB生成XML文件去除Standlone

    /**      * JAXB:java对象转换为xml文件(java對象需要添加註解)      * @param obj 要序列化文件的java对象      * @param model jav ...

  9. jaxb java_JAXB xml与javaBean的转换

    转自:https://blog.csdn.net/lydong_/article/details/79812626 `1. 1.不认识到犯错,然后得到永久的教训. 也不是所谓的教训吧,真正的教训来自于 ...

最新文章

  1. 记selenium1.0升级到selenium2.0
  2. python利器怎么编程-Python实现翻译小工具!几行代码搞定!装逼利器有没有!
  3. 初次安装Magento商城 后台报错的解决方案
  4. Python入门100题 | 第061题
  5. 145. 超市【小根堆 贪心】
  6. leetcode 62 不同路径
  7. 前端学习(1535):单一页面的优势
  8. Android 系统(227)---Android屏幕截图
  9. DoG(Difference of Gaussian)
  10. Response JSON数据返回
  11. java 调用 c# webservice 压缩 Liststring示例
  12. sql数据库身份验证登录
  13. 《算法导论》2.2练习答案
  14. 科技文献检索(五)——检索原理
  15. Unity3d C# Socket 下载文件 (同步到)
  16. 机器学习笔记 - 什么是支持向量回归(SVR)?
  17. 为什么手机网速太慢_为什么手机连上WiFi网速很慢
  18. 增量式PID是什么?不知道你就落伍了
  19. iOS平台游戏安全再议之存档修改与防御
  20. openGL es2.0 粒子系统之烟花

热门文章

  1. java线程睡眠分析,java线程睡眠有关问题
  2. 动态规划之最长公共子串
  3. Error during artifact deployment. See server log for details解决办法
  4. 第08课:从自然语言处理角度看 HMM 和 CRF
  5. MySQL优化CPU消耗
  6. 基于内容推荐系统中的常识
  7. Spark笔记:RDD基本操作(下)
  8. Spark RDD使用详解2--RDD创建方式
  9. 天天算法 LeetCode-938-二叉搜索树的范围和
  10. Leetcode PHP题解--D6 595. Big Countries