递归列表生成xml

同事设计了一个数据库表,就是实现树状结构的典型表结构

字段有 id,name,code,parentCode
为了只用一条sql语句就可以遍历出整个树,同事增加了一个字段 treeCode所以数据表看起来就是这样的
    id   name  code parentCode treeCode

1 sind 01 0 01
2 sind01 02 01 0101
3 sind02 03 01 0102
4 aj 04 0 02
5 aj01 05 02 0201

我根据这个表的treeCode用delphi 的AdoQuery通过递归生成了树结构,代码很简单。然后想用java也实现同样的效果,小费了一些功夫,代码看起来也不够简洁。本想用iterator实现了,尝试了很多种办法都不行,最后还是妥协了用list 和 全局index 实现的,树用xml展现的。这里用的dom4j。现在把代码先贴出来,以便以后改进算法。

 class XmlCreator {

private Integer userIndex;

private void FillTheList(List<User> users){
User user = new User();
user.setName("sind");
user.setCode("01");
user.setId(1);
users.add(user);

user = new User();
user.setName("sind01");
user.setCode("0101");
user.setId(2);
users.add(user);


user = new User();
user.setName("sind02");
user.setCode("0102");
user.setId(3);
users.add(user);

user = new User();
user.setName("vicky");
user.setCode("02");
user.setId(4);
users.add(user);

user = new User();
user.setName("vicky01");
user.setCode("0201");
user.setId(5);
users.add(user);
}
public void CreateXmlMain(){
List<User> users = new ArrayList<User>();
FillTheList(users);
this.userIndex = 0;
Document doc = DocumentHelper.createDocument();
doc.setXMLEncoding("GBK");
Element root = doc.addElement("tree");
CreateXmlNode(users,root);
System.out.print(doc.asXML());
}
public void CreateXmlNode(List<User> list,Element el){
//获取循环前 当前Code长度
int codeLength = list.get(userIndex).getCode().length();
while (userIndex<list.size()){
User user = list.get(userIndex);
//判断如果Code长度与上一个相同则循环添加节点,否则跳出循环 ...如果没有这个判断,会导致循环无法及时跳出,递归出错
if (codeLength == user.getCode().length()){
//添加节点
Element sel = el.addElement("item");
sel.addAttribute("name", user.getName());
codeLength = user.getCode().length();
//索引递增1
userIndex++;
//判断下一个Code长度是否大于当前长度,如果是则递归
if (userIndex<list.size()&&list.get(userIndex).getCode().length()>codeLength){
CreateXmlNode(list,sel);
}
}else break;
}
}
}



生成的xml如下
<?xml version="1.0" encoding="GBK" ?> 
<tree>
<item name="sind">
<item name="sind01" />
<item name="sind02" />
</item>
<item name="vicky">
<item name="vicky01" />
</item>
</tree>


感觉肯定有更简单的办法实现这个递归,可惜对java语言的理解还是太肤浅,期待日后改进
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值