我有一个List里面是保存的是一个KrSysModule对象, 现在想根据List内容生成一个xml字符串。写了几遍,没有写出来,望大侠赐教。。
  KrSysModule对象字段:
  private String node ;
  private String name;
  private String parentNode;  数据格式
  -----------------------------
  node         name         parentNode
  0            根节点     
  0001         节点1        0
  0001001      节点11       0001
  0002         节点2        0
我想上面个数输出数据格式为String,格式为:
<XML>
  <node name='根节点'>
     <node name='节点1>
        <node name='节点11'>
        </node>
     </node>
    
     <node name='节点2'>
     </node>
  </node></XML>当然节点的子节点没有限制。。

解决方案 »

  1.   

    你这个用List 存储遍历起来挺麻烦的哦  Map 相对效率提高和难易度也会降低。不知道你这个是非要用LIST来存储及处理吗?
      

  2.   

    用MAP可以做 不用也能做 不过稍微麻烦些看你这个有记录parentNode 难道LZ就没有想过也让这个对象持有一个子节点的集合么?通过NODEID(用MAP存储查找能快些) 先将所有的节点之间的关系弄清楚 然后就通过根节点一层层的获得被 如果不明白晚上回家给你弄例子..
      

  3.   

    这个数据,直接查询出来就是List,,Hibernate..
      

  4.   

    其实我想在边递归的时候,把List的值给remove一个。
      

  5.   

    LZ可以考虑一下java.util.Stack
    堆栈啊,写一个头部system.out.println("<" + element.getName() + ">");
    stack.push(Element)
    继续写子项,可以调用本身方法(递归)
    Element = stack.pop();
    system.out.println("</" + element + ">">
      

  6.   


    class KrSysModule{
        String no;
        String name;
        KrSysModule parent;
        List<KrSysModule> children;
    }
      

  7.   

    呵呵。。偶做了一下,实现了,不知对否:
    节点类。import java.util.ArrayList;
    import java.util.List;
    public class Node {
    private String id;
    private String name;
    private Node parentNode;
    List childList = new ArrayList(); public String getName() {
    return name;
    } public void setName(String name) {
    this.name = name;
    } public Node getParentNode() {
    return parentNode;
    } public void setParentNode(Node parentNode) {
    this.parentNode = parentNode;
    } public String getId() {
    return id;
    } public void setId(String id) {
    this.id = id;
    }
    public void addChild(Node child){
    child.setParentNode(this);
    childList.add(child);
    }
    public List getChildList(){
    return childList;
    }
    }
    实现类:import java.util.Iterator;
    import java.util.List;public class Client { /**
     * @param args
     */
    public static void main(String[] args) {
    Node root = new Node();
    root.setId("root");
    root.setName("根节点");
    root.setParentNode(null);
    for(int i=0;i<10;i++){
    Node node = new Node();
    node.setId("0");
    node.setName("node "+i);
    root.addChild(node);
    for(int j=0;j<10;j++){
    Node node0 = new Node();
    node0.setId(""+i+j);
    node0.setName("node "+i+j);
    node0.setParentNode(node);
    node.addChild(node0);
    }
    }
    //输出生成XML文档。
    System.out.println("<XML>");
    print(root);
    System.out.println("</XML>");
    }

    public static void print(Node node){
    System.out.println("<node name="+node.getName()+">");
    List child = node.getChildList();
    if(!child.isEmpty()){
    Iterator it = child.iterator();
    while(it.hasNext()){
    print((Node)it.next());
    }
    }
    System.out.println("</node>");
    }
    }结果:
    <XML>
    <node name=根节点>
    <node name=node 0>
    <node name=node 00>
    </node>
    <node name=node 01>
    </node>
    <node name=node 02>
    </node>
    <node name=node 03>
    </node>
    <node name=node 04>
    </node>
    <node name=node 05>
    </node>
    <node name=node 06>
    </node>
    <node name=node 07>
    </node>
    <node name=node 08>
    </node>
    <node name=node 09>
    </node>
    </node>
    <node name=node 1>
    <node name=node 10>
    </node>
    <node name=node 11>
    </node>
    <node name=node 12>
    </node>
    <node name=node 13>
    </node>
    <node name=node 14>
    </node>
    <node name=node 15>
    </node>
    <node name=node 16>
    </node>
    <node name=node 17>
    </node>
    <node name=node 18>
    </node>
    <node name=node 19>
    </node>
    </node>
    <node name=node 2>
    <node name=node 20>
    </node>
    <node name=node 21>
    </node>
    <node name=node 22>
    </node>
    <node name=node 23>
    </node>
    <node name=node 24>
    </node>
    <node name=node 25>
    </node>
    <node name=node 26>
    </node>
    <node name=node 27>
    </node>
    <node name=node 28>
    </node>
    <node name=node 29>
    </node>
    </node>
    <node name=node 3>
    <node name=node 30>
    </node>
    <node name=node 31>
    </node>
    <node name=node 32>
    </node>
    <node name=node 33>
    </node>
    <node name=node 34>
    </node>
    <node name=node 35>
    </node>
    <node name=node 36>
    </node>
    <node name=node 37>
    </node>
    <node name=node 38>
    </node>
    <node name=node 39>
    </node>
    </node>
    <node name=node 4>
    <node name=node 40>
    </node>
    <node name=node 41>
    </node>
    <node name=node 42>
    </node>
    <node name=node 43>
    </node>
    <node name=node 44>
    </node>
    <node name=node 45>
    </node>
    <node name=node 46>
    </node>
    <node name=node 47>
    </node>
    <node name=node 48>
    </node>
    <node name=node 49>
    </node>
    </node>
    <node name=node 5>
    <node name=node 50>
    </node>
    <node name=node 51>
    </node>
    <node name=node 52>
    </node>
    <node name=node 53>
    </node>
    <node name=node 54>
    </node>
    <node name=node 55>
    </node>
    <node name=node 56>
    </node>
    <node name=node 57>
    </node>
    <node name=node 58>
    </node>
    <node name=node 59>
    </node>
    </node>
    <node name=node 6>
    <node name=node 60>
    </node>
    <node name=node 61>
    </node>
    <node name=node 62>
    </node>
    <node name=node 63>
    </node>
    <node name=node 64>
    </node>
    <node name=node 65>
    </node>
    <node name=node 66>
    </node>
    <node name=node 67>
    </node>
    <node name=node 68>
    </node>
    <node name=node 69>
    </node>
    </node>
    <node name=node 7>
    <node name=node 70>
    </node>
    <node name=node 71>
    </node>
    <node name=node 72>
    </node>
    <node name=node 73>
    </node>
    <node name=node 74>
    </node>
    <node name=node 75>
    </node>
    <node name=node 76>
    </node>
    <node name=node 77>
    </node>
    <node name=node 78>
    </node>
    <node name=node 79>
    </node>
    </node>
    <node name=node 8>
    <node name=node 80>
    </node>
    <node name=node 81>
    </node>
    <node name=node 82>
    </node>
    <node name=node 83>
    </node>
    <node name=node 84>
    </node>
    <node name=node 85>
    </node>
    <node name=node 86>
    </node>
    <node name=node 87>
    </node>
    <node name=node 88>
    </node>
    <node name=node 89>
    </node>
    </node>
    <node name=node 9>
    <node name=node 90>
    </node>
    <node name=node 91>
    </node>
    <node name=node 92>
    </node>
    <node name=node 93>
    </node>
    <node name=node 94>
    </node>
    <node name=node 95>
    </node>
    <node name=node 96>
    </node>
    <node name=node 97>
    </node>
    <node name=node 98>
    </node>
    <node name=node 99>
    </node>
    </node>
    </node>
    </XML>
      

  8.   

    楼上写的很有问题。楼主说的是根据一个List生成XML。
      

  9.   

    [size=16px][size=11px][/size][/size]
      

  10.   

    楼上的老大,,那是关于List的。
      

  11.   

    import java.util.ArrayList;
    import java.util.HashMap;
    import java.util.List;public class ConvertPlaneToTree {
    public static void main(String[] args){
    ArrayList<KrSysModule> moduleList = new ArrayList<KrSysModule>();
    moduleList.add(new KrSysModule("0","根节点",null));
    moduleList.add(new KrSysModule("0001","节点1","0"));
    moduleList.add(new KrSysModule("0001001"," 节点11","0001"));
    moduleList.add(new KrSysModule("0002","节点2","0"));
    HashMap<String,Node> idNodeMap = new HashMap<String,Node>();
    int size = moduleList.size();
    for(int i=0;i<size;i++){
    KrSysModule tempModule = moduleList.get(i);
    Node tempNode = new Node(tempModule.getName());
    idNodeMap.put(tempModule.getNode(), tempNode);
    }
    Node root = null;
    for(int i=0;i<size;i++){
    KrSysModule tempModule = moduleList.get(i);
    String parentName = tempModule.getParentNode();
    if(parentName != null){
    Node parentNode = idNodeMap.get(parentName);
    String curName = tempModule.getNode();
    Node curNode = idNodeMap.get(curName);
    parentNode.childNodes.add(curNode);
    curNode.parentNode = parentNode;
    }else{
    String curName = tempModule.getNode();
    root = idNodeMap.get(curName);
    }
    }
    System.out.println(iterateNode(root,1));

    }
      

  12.   

    public static String iterateNode(Node parent,int level){
    StringBuilder builder = new StringBuilder();
    int spaceNum = level*4;
    for(int i=1;i<=spaceNum;i++){
    builder.append(' ');
    }
    builder.append("<node name=\""+parent.name+"\">\n");
    List<Node> childList = parent.childNodes;
    int childSize = childList.size();
    for(int i=0;i<childSize;i++){
    Node childNode = childList.get(i);
    builder.append(iterateNode(childNode,level+1));
    }
    builder.append("\n");
    for(int i=1;i<=spaceNum;i++){
    builder.append(' ');
    }
    builder.append("</node>\n");
    return builder.toString();
    }
    }
    class KrSysModule{
    private String node ; 
    private String name; 
    private String parentNode;
    public KrSysModule(String node,String name,String parentNode){
    this.node = node;
    this.name = name;
    this.parentNode = parentNode;
    }
    public String getNode() {
    return node;
    }
    public void setNode(String node) {
    this.node = node;
    }
    public String getName() {
    return name;
    }
    public void setName(String name) {
    this.name = name;
    }
    public String getParentNode() {
    return parentNode;
    }
    public void setParentNode(String parentNode) {
    this.parentNode = parentNode;
    }
    }
    class Node{
    Node parentNode;
    List<Node> childNodes = new ArrayList<Node>();
    String name;
    public Node(String name){
    this.name = name;
    }
    public void addChild(Node childNode){
    childNodes.add(childNode);
    }
    }
      

  13.   

    基本思路是先建立一个map,再循环list,利用先前建立的map建立tree,最后递归这颗树,打印树的内容。
      

  14.   


    private int level = 0;

    public int getLevel() {
    return level;
    } public void setLevel(int level) {
    this.level = level;
    }
    /**
     * 递归生成树算法
     * @param list :查询出来的结果集
     * @param father:父节点
     * @param arraryList 新的结果集
     */
    public void buildTree(List list, String father,ArrayList arraryList) {
    for (int i = 0; i < list.size(); i++) {
    HashMap map = (HashMap) list.get(i);
    String Type_Parent_Id = (String) map.get("parentId");
    String Type_Id = (String) map.get("id");
    if (Type_Parent_Id.equals(father)) {
    map.put("level", level);
    arraryList.add((HashMap) list.get(i));
    level++;
    buildTree(list, Type_Id,arraryList);
    }
    }
    level--;
    }

    数据库加一个level 字段,用来orderby 
    调用:
    int level = 0;
    Category cat = new Category();
    ArrayList arraryList = new ArrayList();
    List list = db.getCatList(conn,sql);
    cat.setLevel(level);
    cat.buildTree(list, "0",arraryList);
      

  15.   

    不好意思。哥们让你久等了。
    第一步:下载JDOM包。下载地址:http://www.jdom.org/dist/binary/  下载的是jdom-1.1.1.zip第二步:解压后,把jdom/build下的jdom.jar和jdom/lib/jaxen.jar拷贝到你Eclipse项目中的libs下,并且加入到Build Path中。这个就不用我多说了吧。第三步:KrSysModule的Bean。这个应该你有。public class KrSysModule {
    private String node ; 
    private String name; 
    private String parentNode;
     
    public String getNode() {
    return node;
    }
    public void setNode(String node) {
    this.node = node;
    }
    public String getName() {
    return name;
    }
    public void setName(String name) {
    this.name = name;
    }
    public String getParentNode() {
    return parentNode;
    }
    public void setParentNode(String parentNode) {
    this.parentNode = parentNode;

    }
    第四步:生成XML文件。这里我默认生成到C盘根本下了,叫aa.xml。你可以自己更改。import java.io.FileOutputStream;
    import java.io.IOException;
    import java.util.ArrayList;
    import java.util.Collections;
    import java.util.Comparator;
    import java.util.List;import org.jdom.Document;
    import org.jdom.Element;
    import org.jdom.JDOMException;
    import org.jdom.output.XMLOutputter;
    import org.jdom.xpath.XPath;public class ListToXML { //对外方法
    public void list2xml(List<KrSysModule> list) throws Exception, IOException {
    if(list != null) {
    //第一步,进行List排序,用来保证要创建的节点的父节点事先已经创建了。(比较关键)
    this.sortKrSysModules(list);
    //第二步,根据list生成XML
    Document doc = this.buildXMLByList(list);
    //写出文件
    XMLOutputter XMLOut = new XMLOutputter(); 
    XMLOut.output(doc, new FileOutputStream("c:/aa.xml"));
    }
    }

    //进行排序
    private void sortKrSysModules(List<KrSysModule> list) {
    if(list != null) {
    Collections.sort(list, new Comparator() {
    public   int   compare(Object   o1,Object   o2)   {
    KrSysModule   kr1=(KrSysModule)o1;   
    KrSysModule   kr2=(KrSysModule)o2;   
    return   kr1.getParentNode().compareTo(kr2.getParentNode());   
    }
    });
    }
    }

    //通过List构建Document
    private Document  buildXMLByList(List<KrSysModule> list) throws JDOMException {
    Element xml = new Element("xml");
    Document doc = new Document(xml);
    if(list != null) {
    for(KrSysModule m : list) {
    if(m.getParentNode().length()>0) {//有父节点
    Element pNode = (Element) XPath.selectSingleNode(doc, "//node[@id='"+m.getParentNode()+"']");
    if(pNode != null) {
    Element sNode = new Element("node");
    sNode.setAttribute("id", m.getNode());
    sNode.setAttribute("name", m.getName());
    pNode.addContent(sNode);
    }
    }else {//根节点
    Element root = new Element("node");
    root.setAttribute("id", m.getNode());
    root.setAttribute("name", m.getName());
    xml.addContent(root);
    }
    }
    }
    return doc;
    }

    //测试主方法
    public static void main(String[] args) {
    //生成测试数据
    KrSysModule module0 = new KrSysModule();
    module0.setNode("0");
    module0.setName("根节点");
    module0.setParentNode("");
    KrSysModule module1 = new KrSysModule();
    module1.setNode("0001");
    module1.setName("节点1");
    module1.setParentNode("0");
    KrSysModule module2 = new KrSysModule();
    module2.setNode("0001001");
    module2.setName("节点11");
    module2.setParentNode("0001");
    KrSysModule module3 = new KrSysModule();
    module3.setNode("0002");
    module3.setName("节点2");
    module3.setParentNode("0");
    List<KrSysModule> list = new ArrayList<KrSysModule>();
    list.add(module0);
    list.add(module1);
    list.add(module2);
    list.add(module3);
    //生成xml
    ListToXML listToXml = new ListToXML();
    try {
    System.out.println("开始生成文件");
    listToXml.list2xml(list);
    System.out.println("生成文件完成");
    } catch (Exception e) {
    e.printStackTrace();
    }

    }
    }
      

  16.   

    呵呵,楼上的老大,,我要生成的是xml结构的字符串,不是文件,,不过我先看看你写的,,辛苦了。。
      

  17.   

    呵呵。哥们你可真懒啊。我又给你改了一下package org.quubox.com;import java.io.ByteArrayOutputStream;
    import java.io.FileOutputStream;
    import java.io.IOException;
    import java.util.ArrayList;
    import java.util.Collections;
    import java.util.Comparator;
    import java.util.List;import org.jdom.Document;
    import org.jdom.Element;
    import org.jdom.JDOMException;
    import org.jdom.output.Format;
    import org.jdom.output.XMLOutputter;
    import org.jdom.xpath.XPath;public class ListToXML { //对外方法
    public String list2xml(List<KrSysModule> list) throws Exception, IOException {
    String xml = "";
    if(list != null) {
    //第一步,进行List排序,用来保证要创建的节点的父节点事先已经创建了。(比较关键)
    this.sortKrSysModules(list);
    //第二步,根据list生成XML
    Document doc  = this.buildXMLByList(list);
    //第三步,生成字符串
    xml = this.buildXMLString(doc);
    }
    return xml;
    }
    //生成字符串
    private String buildXMLString(Document doc) throws IOException {
    if(doc != null) {
    Format format = Format.getPrettyFormat(); 
            java.util.Properties sysProp = new java.util.Properties(System.getProperties());
            String sysFileEncoding = sysProp.getProperty("file.encoding");//得到操作系统的编码        
            format.setEncoding(sysFileEncoding);//设置编码格式
    XMLOutputter xmlout = new XMLOutputter(format);
    ByteArrayOutputStream out = new ByteArrayOutputStream();
    String xmlStr = null;        
    xmlout.output(doc,out);
    xmlStr = out.toString();//将xml内容转化为字符串
    return xmlStr;
    }
    return "";
    }

    //进行排序
    private void sortKrSysModules(List<KrSysModule> list) {
    if(list != null) {
    Collections.sort(list, new Comparator() {
    public   int   compare(Object   o1,Object   o2)   {
    KrSysModule   kr1=(KrSysModule)o1;   
    KrSysModule   kr2=(KrSysModule)o2;   
    return   kr1.getParentNode().compareTo(kr2.getParentNode());   
    }
    });
    }
    }

    //通过List构建Document
    private Document  buildXMLByList(List<KrSysModule> list) throws JDOMException {
    Element xml = new Element("xml");
    Document doc = new Document(xml);
    if(list != null) {
    for(KrSysModule m : list) {
    if(m.getParentNode().length()>0) {//有父节点
    Element pNode = (Element) XPath.selectSingleNode(doc, "//node[@id='"+m.getParentNode()+"']");
    if(pNode != null) {
    Element sNode = new Element("node");
    sNode.setAttribute("id", m.getNode());
    sNode.setAttribute("name", m.getName());
    pNode.addContent(sNode);
    }
    }else {//根节点
    Element root = new Element("node");
    root.setAttribute("id", m.getNode());
    root.setAttribute("name", m.getName());
    xml.addContent(root);
    }
    }
    }
    return doc;
    }

    //测试主方法
    public static void main(String[] args) {
    //生成测试数据
    KrSysModule module0 = new KrSysModule();
    module0.setNode("0");
    module0.setName("根节点");
    module0.setParentNode("");
    KrSysModule module1 = new KrSysModule();
    module1.setNode("0001");
    module1.setName("节点1");
    module1.setParentNode("0");
    KrSysModule module2 = new KrSysModule();
    module2.setNode("0001001");
    module2.setName("节点11");
    module2.setParentNode("0001");
    KrSysModule module3 = new KrSysModule();
    module3.setNode("0002");
    module3.setName("节点2");
    module3.setParentNode("0");
    List<KrSysModule> list = new ArrayList<KrSysModule>();
    list.add(module0);
    list.add(module1);
    list.add(module2);
    list.add(module3);
    //生成xml
    ListToXML listToXml = new ListToXML();
    try {
    System.out.println(listToXml.list2xml(list));;
    } catch (Exception e) {
    e.printStackTrace();
    }

    }
    }
    输出如下:<?xml version="1.0" encoding="UTF-8"?>
    <xml>
      <node id="0" name="根节点">
        <node id="0001" name="节点1">
          <node id="0001001" name="节点11" />
        </node>
        <node id="0002" name="节点2" />
      </node>
    </xml>
      

  18.   

    up//第一步,进行List排序,用来保证要创建的节点的父节点事先已经创建了。(比较关键)
                this.sortKrSysModules(list);
      

  19.   

    谢谢各位的指点,,mayuanfei,老大你写的方法把挺好,但是加jdom包,,我想了一个办法,,简单实用,,用正则表达式去做,,很简单。老大们可以看看,指点一下。
    public String getTree(String condition) {

    String result = "<XML>";

    List data = this.query(condition, "0");

    for (int i = 0; i < data.size(); i++) {
    KrSpDataDictionary krSpDataDictionary = (KrSpDataDictionary) data
    .get(i); String _regexp = "(.*?)(<node id='" + krSpDataDictionary.getParentNode()
    + ".*?>)(.*?)(</" + krSpDataDictionary.getParentNode()
    + "node>)(.*?)"; String nodes = "<node id='" + krSpDataDictionary.getNode()
    + "' name='" + krSpDataDictionary.getName() + "'></"
    + krSpDataDictionary.getNode() + "node>";  Pattern p = Pattern.compile(_regexp);
     Matcher m = p.matcher(result);
     boolean b = m.matches(); if (b) {
    result = result.replaceAll(_regexp, "$1$2$3"+nodes+"$4$5");
    } else {
    result += nodes;
    } }

    result += "</XML>";

    result = result.replaceAll("</.*?node>", "</node>");

    return result;
    }
      

  20.   

    XML本身用树型结构来描述不是更好么。
    左边儿子,右边兄弟的。
    先生成一个树,
    然后通过递归来生成XML文件。
    否则光是LIST的遍历就够呛
      

  21.   

    好吧,都用上JDOM包包了。
    当俺米说吧