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的性能优化, 以及内部的实现机制多多深入研究一下.
Jaxb对xml报文头的小修小改的更多相关文章
- xml报文解析和组装
package com.xjts.cipher.util;import java.io.File;import java.io.FileWriter;import java.io.IOExceptio ...
- 使用JAXB读写xml
1.注解 在Java模型中的创建与 xml 文件对应的节点和属性需要用注解来表示 @XmlRootElement 作用:将一个Java类映射为一段XML的根节点参数: name 定义这个根节点 ...
- Java开发笔记(一百零九)XML报文的定义和解析
前面介绍了JSON格式的报文解析,虽然json串短小精悍,也能有效表达层次结构,但是每个元素只能找到对应的元素值,不能体现更丰富的样式特征.比如某个元素除了要传输它的字符串文本,还想传输该文本的类型. ...
- 接口中的xml报文和实体类的之间转换
需求:湖南保险行业意健险承保风险预警平台数据接口 平台提供HTTPServlet服务,接受保险公司的数据请求,并在处理后返回给保险公司相应的处理结果.数据接口格式为XML数据报文,在每次接口的交易中, ...
- JAXB读写xml
一.注解 在Java模型中的创建与 xml 文件对应的节点和属性需要用注解来表示 @XmlRootElement 作用:将一个Java类映射为一段XML的根节点参数: name 定义这个根节点 ...
- xml报文的装配解析
xstream dom 将map自动转化为xml报文 http://blog.csdn.net/lisheng19870305/article/details/45847985 报文的通信
- 上传文件时,Request报文头不同浏览器会产生不同的content-type
选择一个zip文件上传,用IE看的报文头是image/jpeg,用chrom看是application/octet-stream. 第一次遇到这个类型的content-type,百度了一下, octe ...
- 自己动手学TCP/IP–http协议(http报文头)
在前面的一篇文章中,简单了介绍了HTTP报文格式,详情参考http://www.firefoxbug.net/?cat=47. 这里大概介绍下基本的,常见的HTTP包头格式. POST /report ...
- TCP/IP协议族(二) HTTP报文头解析
本篇博客我们就来详细的聊一下HTTP协议的常用头部字段,当然我们将其分为请求头和响应头进行阐述.下方是报文头每个字段的格式,首先是头部字段的名称,如Accept,冒号后方紧跟的是该字段名所对应的值,每 ...
随机推荐
- NOIP2006能量项链
题目描述 在Mars星球上,每个Mars人都随身佩带着一串能量项链.在项链上有N颗能量珠.能量珠是一颗有头标记与尾标记的珠子,这些标记对应着某个正整数.并且,对于相邻的两颗珠子,前一颗珠子的尾标记一定 ...
- 牛客第二场Dmoney
链接:https://www.nowcoder.com/acm/contest/140/D 来源:牛客网 题目描述 White Cloud has built n stores numbered to ...
- iOS架构设计系列之解耦的尝试之变异的MVVM
最近一段时间,在思考如何合理的架构一个可扩展性良好的界面编程方式.这一部分的成果做成了一个叫ElementKit的库.目前功能在不断的完善中. 关于iOS的架构,看多了MVVM,VIPER,MVC,M ...
- 【转】EF 获取类的属性并排除特定属性(getType().GetProperties())
当获取一个类型(class)的所有属性时,想排除指定属性,该如何操作? 比如:EF中一个实体类型UserEntity,通过反射获取这个类的属性时,想排除这个为映射的字段ID 使用以下方法即可! Pro ...
- redis集群搭建教程(以3.2.2为例)
redis从3.0版本开始支持集群,2.X版本主支持sentinel主从模式:所以要搭建集群务必下载3.0以上版本,本教程以3.2.2版本为例. redis集群最少要有3个主节点,最典型的是3主3从组 ...
- Qt中QSlider的样式表设置
转自: https://blog.csdn.net/tax10240809163com/article/details/50899023 //首先是设置主体QSlider{border-color: ...
- Java中static的用法,初始化块
使用 Arrays 类操作 Java 中的数组语法: Arrays.sort(数组名); 可以使用 sort( ) 方法实现对数组的排序,只要将数组名放在 sort( ) 方法的括号中,就可以完成对该 ...
- 图片加载------reactVirtualized
作用: 让HTML文档始终保持固定数量的图片数量,可以节省带宽
- 将远程mysql服务器数据导出 csv 并发送到我的本机
1.在SQL上执行查询并导出操作 '; 2.发送到本机 SQL>system sz idIsNull2.csv;
- PC/FORTH定点原理
body, table{font-family: 微软雅黑} table{border-collapse: collapse; border: solid gray; border-width: 2p ...