[转] fitnesse中的Map处理
http://blog.csdn.net/doubeizhucele/article/details/42263887
fintesse会把!{}标记的变量视为HashTable对象,展现到页面上的将是table格式(userguide中提到可以改变hashtable的css样式)
====== Java 代码 =========
public Map getMap(Map map) {
Set set =map.keySet();
for(Object key:set){
System.out.println(key+":"+map.get(key));
}
return map;
}
====== fitnesse脚本 ============
!define teacher [!{name:laozhang,tech:Math}]
!define xiaoming [!{name:tom,age:18,teacher:${teacher}}]
|script|!-Test-! |
|$a= |getMap; |${xiaoming}|
==== 执行结果 =======
====== 分析原因 =================
1. 修改代码
public Map getMap(Map map) {
Set set =map.keySet();
for(Object key:set){
System.out.println(key+":"+map.get(key).getClass().getName());
}
return map;
}
2. 执行fitnesse脚本后,查看日志,发现teacher的value是String型,而不是hashtable对象
age:java.lang.String
name:java.lang.String
teacher:java.lang.String
3. 再次修改代码
public Map getMap(Map map) {
Map output = new HashMap();
Set set = map.keySet();
for (Object key : set) {
System.out.println(key+":"+hashtableString2Map((String) map.get(key)));
output.put(key, hashtableString2Map((String) map.get(key)));
}
return output;
}
4. 执行fitnesse脚本后,查看输出结果和日志
age:18
name:tom
teacher:{name=laozhang, tech=Math}
5. 再次分析原因,发现fitnesse会把map接口对象自动视为hashtable(应该是为了fitnesse展现出较好的样式,但是如果把结果对象作为参数传入到其他方法内,可能会造成不可预期的错误,比如JSONObject的fromObject方法),为了避免可能的错误,需要把输出类型强制转换为HashMap,代码如下
public HashMap getMap(Map map) {
Map output = new HashMap();
Set set = map.keySet();
for (Object key : set) {
System.out.println(key+":"+hashtableString2Map((String) map.get(key)));
output.put(key, hashtableString2Map((String) map.get(key)));
}
return (HashMap) output;
}
==== 新增方法hashtableString2Map ============
public static Object hashtableString2Map(String hashtableString) {
if (hashtableString.startsWith("<table class=\"hash_table\">")
&& hashtableString.endsWith("</table>")) {
Map map = new HashMap();
Document document = XMLParser
.getDocumentFromString(hashtableString);
Element parent = XMLParser.getRootNode(document);
List hash_rows = parent.elements();
String key = "";
String value = "";
for (int i = 0; i < hash_rows.size(); i++) {
Element hash_row = (Element) hash_rows.get(i);
List hashtableList = hash_row.elements();
for (int j = 0; j < hashtableList.size(); j++) {
Element ele = (Element) hashtableList.get(j);
String attrValue = ele.attributeValue("class");
if ("hash_key".equals(attrValue)) {
key = ele.getText();
} else if ("hash_value".equals(attrValue)) {
value = ele.getText();
}
map.put(key, value);
}
}
return map;
}
return hashtableString;
}
再次执行fitnesse脚本,得到结果
[转] fitnesse中的Map处理的更多相关文章
- 【转】hive优化之--控制hive任务中的map数和reduce数
一. 控制hive任务中的map数: 1. 通常情况下,作业会通过input的目录产生一个或者多个map任务. 主要的决定因素有: input的文件总个数,input的文件大小,集群设置 ...
- Map java中的map 如何修改Map中的对应元素
Map java中的map 如何修改Map中的对应元素 Map以按键/数值对的形式存储数据,和数组非常相似,在数组中存在的索引,它们本身也是对象. Map的接口 Map ...
- Java中Set Map List 的区别
java中set map list的区别: 都是集合接口 简要说明 set --其中的值不允许重复,无序的数据结构 list --其中的值允许重复,因为其为有序的数据结构 map--成对的数据结构 ...
- Java中遍历Map集合的四种方法
在Java中如何遍历Map对象 How to Iterate Over a Map in Java 在java中遍历Map有不少的方法.我们看一下最常用的方法及其优缺点. 既然java中的所有map都 ...
- java8中的map和reduce
java8中的map和reduce 标签: java8函数式mapreduce 2014-06-19 19:14 10330人阅读 评论(4) 收藏 举报 分类: java(47) FP(2) ...
- zk框架中利用map类型传值来创建window,并且传值
@Command @NotifyChange("accList") public void clear(@BindingParam("id") String a ...
- python 中的map 详解
python中的map函数应用于每一个可迭代的项,返回的是一个结果list.如果有其他的可迭代参数传进来,map函数则会把每一个参数都以相应的处理函数进行迭代处理.map()函数接收两个参数,一个是函 ...
- 由实现JavaScript中的Map想到的
项目中要用到JavaScript中的Map数据类型,它不像JDK那样有自带的,怎么办?搜了找到一个不错的(http://darkmasky.iteye.com/blog/454749).用这个可以满足 ...
- perl编程中的map函数示例
转自:http://www.jbxue.com/article/14854.html 发布:脚本学堂/Perl 编辑:JB01 2013-12-20 10:20:01 [大 中 小] 本文介绍 ...
随机推荐
- git的版本回退探索
简介 今天改完代码匆忙提交,上线发现有问题,那怎么办?废话,赶紧回滚,那怎么回滚,开始用git reset [--soft | --mixed | --hard 命令,但这命令真的能达到我预期的效果吗 ...
- InstallShield打包,以及集成TFS、JenKins
一. InstallShield打包脚本教程,这里面写的很详细了 [海洋女神原创]一个完整的Installshield安装程序实例—艾泽拉斯之海洋女神出品(一)---基本设置一 需要补充的是Insta ...
- C语言 · x的x次幂结果为10
如果x的x次幂结果为10(参见[图1.png]),你能计算出x的近似值吗? 显然,这个值是介于2和3之间的一个数字. 请把x的值计算到小数后6位(四舍五入),并填写这个小数值. 注意:只填写一个小数, ...
- page size == 4096 , nand size == 1GB, block size == 256kb 的ubi 文件系统制作
mkubiimg.sh 2 sudo mkfs.ubifs -F -q -r rootfs_ecm_5410 -m 4096 -e 253952 -c 3600 -o ubifs.img 3 4 ec ...
- [Timer]应用层实现sleep
转自:https://www.cnblogs.com/longbiao831/p/4556246.html Select只能做延时,可以做回调吗? 本文讲述如何使用select实现超级时钟.使用sel ...
- Linux mail命令使用和sendmail配置
linux mail 命令参数: 使用mail发邮件时,必须先将sendmail服务启动. mail –s “邮件主题” –c”抄送地址” –b “密送地址” -- -f 发送人邮件地址 –F 发件人 ...
- linq操作符:串联操作符
串联是一个将两个集合连接在一起的过程.在Linq中,这个过程通过Concat操作符实现.Concat操作符用于连接两个集合,生成一个新的集合.来看看Concat操作符的定义: public stati ...
- VS2008中设置字体大小和添加显示行号
1.字体设置 菜单->工具->选项->环境->字体和颜色 在字体那一栏可以选字体,VC6.0默认的字体是Fixedsys,字体大小你可以设为12,就与VC6.0的一样的字体了. ...
- 基于Zookeeper的分步式队列系统集成案例
基于Zookeeper的分步式队列系统集成案例 Hadoop家族系列文章,主要介绍Hadoop家族产品,常用的项目包括Hadoop, Hive, Pig, HBase, Sqoop, Mahout, ...
- ajax操作之操作 JavaScript 对象
通过请求获取充分格式化的HTML虽然很方便,但这也意味着必须在传输文本内容的同时也 传输很多HTML标签.有时候,我们希望能够尽量少传输一些数据,然后马上处理这些数据.在 这种情况,我们希望取得能够通 ...