困扰很久的问题,帮帮忙

水中影子 2009-11-19 04:04:39
数据库结构如下
id name parentid level isdetail
--------------------------------------------------------
1001 1001-ok 1 0
100101 100101-ok 1001 2 1
100102 100102-ok 1001 2 1
1002 1002-ok 1 0
100201 100201-ok 1002 2 0
10020101 10020101-ok 100201 3 1
1002010101 1002010101 10020101 4 1
......

想生成结构如下:
<node>
<node id="1001" label="1001-ok">
<node id="100101" label="100101-ok"></node>
<node id="100102" label="100102-ok"></node>
</node>
<node id="1002" label="1002-0k">
<node id="100201" label="100201-0k">
<node id="10020101" label="10020101-0k">
<node id="1002010101" label="1002010101-0k"></node>
<node>
</node>
</node>
</node>
数据查出来很容易,就是闭合</node>不好加

有写过类似的分享一下,谢谢!!!
...全文
155 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
wucq65 2009-11-25
  • 打赏
  • 举报
回复
你把生成的XML文件读取出来不就是STRING的吗?
水中影子 2009-11-23
  • 打赏
  • 举报
回复
你的回答并没有满足我的要求,我只要返回String类型就可以了。
还是我自己琢磨琢磨吧,分会照给的。
水中影子 2009-11-23
  • 打赏
  • 举报
回复
好的,今天下午就结贴
wucq65 2009-11-23
  • 打赏
  • 举报
回复
现在问题解决了吧,不过得把你的分散出来。要不你就失信啦!
水中影子 2009-11-21
  • 打赏
  • 举报
回复
很感谢楼上的回答,谢谢
wucq65 2009-11-20
  • 打赏
  • 举报
回复
以上这个示例根据你的数据写的,可以符合你的需求!
wucq65 2009-11-20
  • 打赏
  • 举报
回复
package com.china1168.utils;

import java.io.FileWriter;
import java.sql.Connection;
import java.util.Iterator;
import java.util.List;
import java.util.Map;

import org.dom4j.Document;
import org.dom4j.DocumentHelper;
import org.dom4j.Element;
import org.dom4j.io.OutputFormat;
import org.dom4j.io.XMLWriter;

import com.china1168.db.C3P0Pool;
import com.china1168.db.DBWrapper;
import com.china1168.log.Log;

public class createXml {
private Log logger = new Log(createXml.class);
private static createXml createxml = null;
//单例
public static createXml getInstance(){
if(createxml == null){
createxml = new createXml();
}
return createxml;
}
/**
* 创建 XML 文档
* @param xmlfilepath XML 文档路径与XML文件名 如:D:/test.xml
* @param root org.dom4j.Document XML 文档
*/
public void writeXMLFile(String xmlfilepath, Document xmldocment) {
OutputFormat outputFormat = OutputFormat.createPrettyPrint();
outputFormat.setEncoding("GB2312");//设置XML文档编码格式
logger.info("开始创建 XML 文件...");
try {
XMLWriter xMLWriter = new XMLWriter(new FileWriter(xmlfilepath),
outputFormat);
xMLWriter.write(xmldocment);
xMLWriter.close();
logger.info("XML 文件创建成功!");
} catch (Exception e) {
// TODO: handle exception
logger.error("XML 文件创建失败!错误信息:" + e.getMessage());
}
}
/**
* 根据数据源 listMap 添加 XML 节点
* @param listMap 数据源 listMap
* @return 返回 XML Document
*/
@SuppressWarnings("unchecked")
public Document createDataXML(java.util.List<java.util.Map> listMap){
// 生成根节点,并为根节点添加属性和属性值
Element root = (Element) DocumentHelper.createElement("nodes");
Element childElementparent = null;
Element childElement = null;
Iterator it = listMap.iterator();
for(Object obj : listMap){
Map map = (Map)obj;
String id = (map.get("ID") != null || !"".equals(map.get("ID"))) ? map.get("ID").toString() : "";
String label = (map.get("NAME") != null || !"".equals(map.get("NAME"))) ? map.get("NAME").toString() : "";
List list = getDataSourceList(id);
//判断是否有子节点
if(list.size()>0){
Iterator ittemp = list.iterator();
childElementparent = (Element) DocumentHelper.createElement("node").addAttribute("id", id).addAttribute("label", label);
for(Object objtemp : list){
Map mattemp = (Map)objtemp;
String tempid = (mattemp.get("ID") != null || !"".equals(mattemp.get("ID"))) ? mattemp.get("ID").toString() : "";
String templabel = (mattemp.get("NAME") != null || !"".equals(mattemp.get("NAME"))) ? mattemp.get("NAME").toString() : "";
childElement = (Element) DocumentHelper.createElement("node").addAttribute("id", tempid).addAttribute("label", templabel);
childElementparent.add(childElement);
}
root.add(childElementparent);
}
}
Document xmldocument = DocumentHelper.createDocument(root);

return xmldocument;
}
/**
* 获取数据源
* @param id id 为空或 null 时查询全部数据
* @return
*/
public java.util.List getDataSourceList(String id){
logger.info("读取数据配置信息开始");
String classPath = "";
List list = null;
try {
classPath = Thread.currentThread().getContextClassLoader().getResource("").toURI().getPath();
classPath = classPath.substring(1)+"jdbc.properties";
System.out.println("classPath:"+classPath);
C3P0Pool c3p0Pool = C3P0Pool.getInstance(classPath);
logger.info("数据配置信息读取成功!");
Connection con = c3p0Pool.getConnection();
DBWrapper dbWrapper = new DBWrapper(con);
logger.info("数据源获取成功!");
dbWrapper.setAutoCommit(false);
dbWrapper.beginTransaction();
StringBuffer sql = new StringBuffer();
sql.append("select * from data_to_xml");
/**
* create table DATA_TO_XML
(
ID VARCHAR2(15),
NAME VARCHAR2(1024),
PARENTID VARCHAR2(64),
LEVEL_T VARCHAR2(21),
ISDETAIL VARCHAR2(10)
)
insert into DATA_TO_XML (ID, NAME, PARENTID, LEVEL_T, ISDETAIL)
values ('1001', '1001-OK', '0', '1', '0');
insert into DATA_TO_XML (ID, NAME, PARENTID, LEVEL_T, ISDETAIL)
values ('100101', '100101-OK', '1001', '2', '1');
insert into DATA_TO_XML (ID, NAME, PARENTID, LEVEL_T, ISDETAIL)
values ('100102', '100102-OK', '1001', '2', '1');
insert into DATA_TO_XML (ID, NAME, PARENTID, LEVEL_T, ISDETAIL)
values ('1002', '1002-OK', '0', '1', '0');
insert into DATA_TO_XML (ID, NAME, PARENTID, LEVEL_T, ISDETAIL)
values ('100201', '100201-OK', '1002', '2', '0');
insert into DATA_TO_XML (ID, NAME, PARENTID, LEVEL_T, ISDETAIL)
values ('10020101', '10020101-OK', '100201', '3', '1');
insert into DATA_TO_XML (ID, NAME, PARENTID, LEVEL_T, ISDETAIL)
values ('1002010101', '1002010101', '10020101', '4', '1');
*/
if(!"".equals(id)&& id != null){
sql.append(" where parentid=?");
}
dbWrapper.setCommand(sql.toString());
if(!"".equals(id)&& id != null){
dbWrapper.setString(1, id);
}
list = dbWrapper.executeQuery();
dbWrapper.commitTransaction();
logger.info("数据读取成功!");
} catch (Exception e) {
// TODO Auto-generated catch block
logger.error("数据读取失败!错误信息:"+e.getMessage());
}
return list;
}

public static void main(String[] args){
List listMap = createXml.getInstance().getDataSourceList("");
Document xmldocument = createXml.getInstance().createDataXML(listMap);
createXml.getInstance().writeXMLFile("D:/test2.xml", xmldocument);
}
}
wanli209 2009-11-19
  • 打赏
  • 举报
回复
有什么条件 就按什么条件加啊
wxj276 2009-11-19
  • 打赏
  • 举报
回复
大类标签应该用<nodes>吧,不然你怎么分??
应该用个判断,
1.定义一个变量tempId,用来记录最新的id(4位的那个如1001)
2.再用循环获得的id,的id.substring(截取字符串函数)与tempId比较,如果不相等结束 </node><node id="">
下面是伪代码,自己根据所用的软件修改一下就行

如for(int i=0;i<=list.size();i++){
String tempId="";
if(int=0){
tempId=id;
<nodes id="id">//开始node节点
}
if(tempId!=id.substring(4)){
</nodes>//结束node节点
<nodes id="id">//重新开始node节点
tempId=id;
}
<node id=“”>内容</node>


}

50,530

社区成员

发帖
与我相关
我的任务
社区描述
Java相关技术讨论
javaspring bootspring cloud 技术论坛(原bbs)
社区管理员
  • Java相关社区
  • 小虚竹
  • 谙忆
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧