文档章节

JAXB 一个问题

D大调协奏曲
 D大调协奏曲
发布于 2016/08/05 09:54
字数 832
阅读 235
收藏 1
点赞 0
评论 0

一:需求

下面是给定的xml格式,需要用javax.xml.bind.annotation 来映射成对象,给别的类调用。从中需要解析出Item 的文本值,每个Item的 code,Cost,charge,OrderNo ,Count的值。

<Exam>	
<ExamItem>			
<Item code='001' Cost='123.45' Charge='123.45' OrderNo='123456' Count='1'>脊椎检查项目</Item>
<Item code='002' Cost='153.00' Charge='123.45' OrderNo='123457' Count='1'>肺部检查项目</Item>
</ExamItem>		
</Exam>

二:解决办法

@XmlAccessorType(XmlAccessType.NONE)
@XmlRootElement(name = "Exam")
public class ReqEaxmsInfo {
	
	@XmlElement(name = "ExamItem")
	private ExamItem examItem;

        @XmlAccessorType(XmlAccessType.NONE)
	public static class ExamItem {
		@XmlElement(name = "Item")
		private List<Item> item;

		public List<Item> getItem() {
			return item;
		}

		public void setItem(List<Item> item) {
			this.item = item;
		}

	}
        @XmlRootElement(name="Item")
	@XmlAccessorType(XmlAccessType.NONE)
	public static class Item{
		@XmlAnyAttribute()
		private Map code;//每个Item的属性值
		@XmlValue
		private String text;
		public Map getCode() {
		       return code;
		}
		public void setCode(Map code) {
			this.code = code;
		}
		public String getText() {
			return text;
		}
		public void setText(String text) {
			this.text = text;
		}
	}
        public ExamItem getExamItem() {
		return examItem;
	}

	public void setExamItem(ExamItem examItem) {
		this.examItem = examItem;
	}
}

这里多设计一个Item类对应xml里面的<Item>节点,里面(Map)code 被@XmlAnyAttribute()注解标识。

@XmlAnyAttribute()这个注解官方给出解释比较笼统:将 JavaBean 属性映射到通配符属性的映射表中

反正没看懂,但是它的使用条件给了我很大启发:

         最多只能使用 @XmlAnyAttribute 注释类中的一个字段或属性。

         属性或字段的类型必须是 java.util.Map。

思考了一下,如要要取得 code,Cost,charge,OrderNo ,Count的值,也要将这些放入一个Map里面去,才比较好取值。所以尝试了一下并且成功了。

(String)text 字段被@XmlValue 注解标识,@XmlValue用来获取节点的值。也就是<Item></Item>中的值。

问题:取不到Map里面的值

当我这样信心满满的搞定的时候,在获取值得问题上被卡住了。我一度以为jdk有毛病...........

ReqEaxmsInfo examsInfo = (ReqEaxmsInfo) marshallerUtils.parseXmlDataObject(ReqEaxmsInfo.class, examsXml);
Map map= examsInfo.getExamItem().getItem().get(0).getCode();
System.out.println("Map----->"+map);
System.out.println("Map keySet()------->"+map.keySet());
System.out.println("code---->"+map.get("code"));

结果却是:

Map----->{Cost=123.45, Count=1, OrderNo=123456, Charge=123.45, code=001}
Map keySet()------->[Cost, Count, OrderNo, Charge, code]
code---->null

我的内心是崩溃的,应为明明Map里面有值,却用Map.get("code") 取不到。嗯,当时我想肯定jdk有问题(玩笑话)。

解决:QName类型的key

Map里面有值,却取不到,肯定就是key不对,要么写错了,要么类型不多。排除第一个,那就是类型不对,不是String类型的,那是什么类型???又开始翻文档。

在处理将解组成为一个值类的属性时,与另一个 JavaBean 属性不存在静态关联的(通过 XmlAttribute)每个属性都被输入 Map<QName,Object> 表示的通配符属性映射表中。属性 QName 是映射表的键。键值是属性的字符串值。

嗯,没错,key的类型是QName类型的,妈蛋,啥玩意不知道,欺负新人.........再去翻文档

 static QName valueOf(String qNameAsString) 
           从解析格式化 String 中派生的 QName。 

呃,一大串文字也没看太懂,反正一眼就看到这个。然后然后就搞定鸟。

System.out.println(map.get(QName.valueOf("code")));

用valueOf这个方法将字符串转成QName,再把它当作key去取值,就可以顺利取出来了

 

© 著作权归作者所有

共有 人打赏支持
D大调协奏曲
粉丝 1
博文 11
码字总数 6895
作品 0
广州
程序员
jaxb替换smooks项目方案建议书

1 前言 本文档是描述Smooks的应用情况,以及使用Jaxb替换smooks的可行性分析及实施方案,有不足之处还望谅解和指出。 2 背景 项目系统中使用Smooks出现几次死锁问题导致系统宕机,其后针对S...

WinnieChan
2013/08/02
0
0
【Apache CXF】CXF对JAX-WS的支持

相关dependency,我使用的版本是2.7.11: 以一个简单的Service为例: import javax.jws.WebMethod;import javax.jws.WebService;@WebServicepublic interface MyCxfService { } 以及其实现: i......

runtimeErr
2014/05/09
0
0
Apache CXF 整合 Map

在进行编码前有必要对一些基本的认识进行介绍,以便后面的讲解。 1、JAXB: JAXB能够使用Jackson对JAXB注解的支持实现(jackson-module-jaxb-annotations),既方便生成XML,也方便生成JSON,这...

yaokangjun
2014/08/21
0
1
正在从引导类加载器加载 JAXB 2.1 API

最近在研究 webService 使用的是CXF实现的服务器端,<br> 使用的开发环境是: jdK1.6 , apache tomcate 6.0, apache-cxf-2.6.13<br> 在部署服务时出现这个问题, Caused by: java.lang.Linka......

txwh
2014/03/14
0
0
使用 JAXB 框架定制 Web 服务行为

Web 服务概述 从本质上来讲 Web 服务就是对外暴露的并能够通过 Web 进行调用的一组 API,它并不要求服务提供方及调用方的技术实现、编程语言、运行平台甚至操作系统等。也正因为这个特点 We...

红薯
2010/03/24
1K
1
关于cxf 连.net 的webservice生成客户端异常( undefined eleme...

今天在使用CXF的wsdl2java.bat 根据wsdl文件生成客户端调用时出现以下错误: 因为也是临时接触CXF,所以一时不知是什么问题,在网上搜了半天,都是说要替换什么内容之类的,但也没说为什么,...

安克诚
2012/07/25
0
0
使用JAXB处理XML文档——先睹为快

JAXB以其方便的XML数据处理能力可能会引起你的兴趣。你可能还不了解JAXB是什么,想要知道它到底有 什么好处,如果这是你需要的,你才会再花时间去细细的研究它,或者你只需要使用最基本的功能...

晨曦之光
2012/03/09
0
0
Java 中的 XML: 数据绑定,第 1 部分:代码生成方法 — JAXB 及其它

企业 Java 专家 Dennis Sosnoski 研究了几种 XML 数据绑定方法,这些方法根据用于 XML 文档的 W3C XML Schema 或 DTD 文法来生成代码。他从人们期待已久的 JAXB 标准(马上就要由 Java Commu...

JavaGG
2009/05/22
1K
0
webservice客户端异常( undefinedelement declaration 's:schema')

原文地址:代码人生(http://wensiqun.iteye.com/blog/1083340) 今天在使用CXF的wsdl2java.bat根据wsdl文件生成客户端调用时出现以下错误: WSDL To Java Error: Thrown by JAXB: undefine...

squanchao
2016/09/07
11
0
JAXB 应用指南

文章转自:http://blog.csdn.net/darxin/article/details/4845820 JAXB(Java Architecture for XML Binding)是一种特殊的序列化/反序列化工具。它可以使XML数据以Java Objects的形式直接应...

红薯
2011/08/06
4.4K
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

实现异步有哪些方法

有哪些方法可以实现异步呢? 方式一:java 线程池 示例: @Test public final void test_ThreadPool() throws InterruptedException { ScheduledThreadPoolExecutor scheduledThre......

黄威
33分钟前
0
0
linux服务器修改mtu值优化cpu

一、jumbo frames 相关 1、什么是jumbo frames Jumbo frames 是指比标准Ethernet Frames长的frame,即比1518/1522 bit大的frames,Jumbo frame的大小是每个设备厂商规定的,不属于IEEE标准;...

六库科技
今天
0
0
牛客网刷题

1. 二维数组中的查找(难度:易) 题目描述 在一个二维数组中(每个一维数组的长度相同),每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入...

大不了敲一辈子代码
今天
0
0
linux系统的任务计划、服务管理

linux任务计划cron 在linux下,有时候要在我们不在的时候执行一项命令,或启动一个脚本,可以使用任务计划cron功能。 任务计划要用crontab命令完成 选项: -u 指定某个用户,不加-u表示当前用...

黄昏残影
昨天
0
0
设计模式:单例模式

单例模式的定义是确保某个类在任何情况下都只有一个实例,并且需要提供一个全局的访问点供调用者访问该实例的一种模式。 实现以上模式基于以下必须遵守的两点: 1.构造方法私有化 2.提供一个...

人觉非常君
昨天
0
0
《Linux Perf Master》Edition 0.4 发布

在线阅读:https://riboseyim.gitbook.io/perf 在线阅读:https://www.gitbook.com/book/riboseyim/linux-perf-master/details 百度网盘【pdf、mobi、ePub】:https://pan.baidu.com/s/1C20T......

RiboseYim
昨天
1
0
conda 换源

https://mirrors.tuna.tsinghua.edu.cn/help/anaconda/ conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/free/conda config --add channels https://mir......

阿豪boy
昨天
1
0
Confluence 6 安装补丁类文件

Atlassian 支持或者 Atlassian 缺陷修复小组可能针对有一些关键问题会提供补丁来解决这些问题,但是这些问题还没有放到下一个更新版本中。这些问题将会使用 Class 类文件同时在官方 Jira bug...

honeymose
昨天
0
0
非常实用的IDEA插件之总结

1、Alibaba Java Coding Guidelines 经过247天的持续研发,阿里巴巴于10月14日在杭州云栖大会上,正式发布众所期待的《阿里巴巴Java开发规约》扫描插件!该插件由阿里巴巴P3C项目组研发。P3C...

Gibbons
昨天
1
0
Tomcat介绍,安装jdk,安装tomcat,配置Tomcat监听80端口

Tomcat介绍 Tomcat是Apache软件基金会(Apache Software Foundation)的Jakarta项目中的一个核心项目,由Apache、Sun和其他一些公司及个人共同开发而成。 java程序写的网站用tomcat+jdk来运行...

TaoXu
昨天
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部