我的数据库的内容是:
tbDept:
ID ParentID DeptName LevelID RoleID
1 0 软体研发处 0 0
2 1 软体研发一部 0 0
3 1 软体研发二部 0 0
4 1 软体研发三部 0 0
5 2 软体研发一部一课 0 0
6 2 软体研发一部二课 0 0
7 3 软体研发二部一课 0 0
8 3 软体研发二部一课 0 0
9 4 软体研发三部一课 0 0
10 4 软体研发三部二课 0 0
11 5 AAA 1 1
12 5 BBB 1 1
......
28 10 RRR 2 2
我想用遍历这个tbDept,然后根据遍历的结果生成带有父子关系的XML文件,小女子望各位能人能够赐教,该如何实现这个XML文档

解决方案 »

  1.   

    用OleDbDataReader读出记录,每读出一条,按ID和ParentID生成相应节点。
      

  2.   

    "按ID和ParentID生成相应节点"
    这个用代码如何实现具有父子关系的XML啊,那levelID和RoleID该往哪放?
      

  3.   

    这个用代码如何实现具有父子关系的XML啊,那levelID和RoleID该往哪放?
      

  4.   

    需求不明确,生成的xml文档是怎样的,LevelID RoleID各代表什么意思
      

  5.   

    LevelID和RoleID分别表示职级和角色,levelID中0代表成员,1代表长官居
    RoleID中1表示BIOS,2表示test,3表示driver,4表示PM我主要需求是:
    能够把tbDept中的表中数据全部用XML表示,XML文档主要具有父子关系,例如:
    <node DeptName="软体研发处" ParentID="0" LevelID="0" RoleID="0">
       <node Deptnaem="软体研发一部" parentID="1" LevelID="0" RoleID="0">
          <node DeptName="软体研发一部一课" ParentID="2" levelID="0" RoleID="0">
            <node DeptName="AAA" ParentID="5" levelID="1" RoleID="1"></node>
            <node DeptName="BBB" ParentID="5" levelID="1" RoleID="1"></node>
            <node DeptName="CCC" ParentID="5" levelID="2" RoleID="1"></node>
          </node>
       </node>
    </node>
    大概是这样,其实我也不知道像这样设计XML会不会不好,因为接下我要把我生成的XML文档填充到datatable,然后绑定到TreeView。
      

  6.   


    查出数据集合,然后遍历插入节点下面是个XMLHelper类,自己看http://www.cnblogs.com/zhdonghu/archive/2010/10/16/1852917.html
      

  7.   

    递归生成先读取到DataTable里面,然后http://dotnet.aspx.cc/file/Recursion-Genernate-XML.aspx
      

  8.   

    查出什么样的数据集合,该怎么插入节点,其实对于XML真是什么都不懂,但不知道该查什么资料来补充这方面的知识
      

  9.   

    我帮你写了个,数据表就是你给出的那部分数据。
    OleDbData md = new OleDbData();
    md.ExecuteReader("select * from tbDept");
    XmlDocument xmlDoc = new XmlDocument();
    XmlElement root = xmlDoc.CreateElement("root");
    xmlDoc.AppendChild(root);
    while (md.Reader.Read())
    {
    int parentID = Convert.ToInt32(md.Reader["ParentID"]);
    XmlElement node = xmlDoc.CreateElement("node");
    for (int i = 0; i < md.Reader.FieldCount; i++)
    node.SetAttribute(md.Reader.GetName(i), md.Reader[i].ToString());
    if (parentID > 0)
    {
    xmlDoc.SelectSingleNode(string.Format(@"//node[@ID='{0}']", md.Reader["ParentID"])).AppendChild(node);
    }
    else
    {
    xmlDoc.DocumentElement.AppendChild(node);
    }
    }
    md.Close();
    xmlDoc.Save(Server.MapPath("~/test.xml"));
    最后生成的xml文件内容:
    <root>
      <node ID="1" ParentID="0" DeptName="软体研发处" LevelID="0" RoleID="0">
        <node ID="2" ParentID="1" DeptName="软体研发一部" LevelID="0" RoleID="0">
          <node ID="5" ParentID="2" DeptName="软体研发一部一课" LevelID="0" RoleID="0">
            <node ID="11" ParentID="5" DeptName="AAA" LevelID="1" RoleID="1" />
            <node ID="12" ParentID="5" DeptName="BBB" LevelID="1" RoleID="1" />
          </node>
          <node ID="6" ParentID="2" DeptName="软体研发一部二课" LevelID="0" RoleID="0" />
        </node>
        <node ID="3" ParentID="1" DeptName="软体研发二部" LevelID="0" RoleID="0">
          <node ID="7" ParentID="3" DeptName="软体研发二部一课" LevelID="0" RoleID="0" />
          <node ID="8" ParentID="3" DeptName="软体研发二部一课" LevelID="0" RoleID="0" />
        </node>
        <node ID="4" ParentID="1" DeptName="软体研发三部" LevelID="0" RoleID="0">
          <node ID="9" ParentID="4" DeptName="软体研发三部一课" LevelID="0" RoleID="0" />
          <node ID="10" ParentID="4" DeptName="软体研发三部二课" LevelID="0" RoleID="0" />
        </node>
      </node>
    </root>
      

  10.   

    不过我用了自己的数据库操作类OleDbData,你改成原生的ADO.NET就行了。
      

  11.   

    我把代码语句位置再调整一下,便于理解:
    XmlDocument xmlDoc = new XmlDocument();
    XmlElement root = xmlDoc.CreateElement("root");
    xmlDoc.AppendChild(root);
    OleDbData md = new OleDbData();
    md.ExecuteReader("select * from tbDept");
    while (md.Reader.Read())
    {
    XmlElement node = xmlDoc.CreateElement("node");
    for (int i = 0; i < md.Reader.FieldCount; i++)
    node.SetAttribute(md.Reader.GetName(i), md.Reader[i].ToString());
    int parentID = Convert.ToInt32(md.Reader["ParentID"]);
    if (parentID > 0)
    xmlDoc.SelectSingleNode(string.Format(@"//node[@ID='{0}']", md.Reader["ParentID"])).AppendChild(node);
    else
    xmlDoc.DocumentElement.AppendChild(node);
    }
    md.Close();
    xmlDoc.Save(Server.MapPath("~/test.xml"));
      

  12.   

    dalmeeme大哥,我想知道"xmlDoc.SelectSingleNode(string.Format(@"//node[@ID='{0}']", md.Reader["ParentID"])).AppendChild(node);”是什么意思?
      

  13.   

    引用 14 楼 dalmeeme 的回复:
    我把代码语句位置再调整一下,便于理解:C# codeXmlDocument xmlDoc = new XmlDocument();
    XmlElement root = xmlDoc.CreateElement("root");
    xmlDoc.AppendChild(root);
    OleDbData md = ne……dalmeeme大哥,我想知道"xmlDoc.SelectSingleNode(string.Format(@"//node[@ID='{0}']", md.Reader["ParentID"])).AppendChild(node);”是什么意思? 
      

  14.   

    孟大哥,小妹对于你给我的路径中的代码“DataRow[] dv = t.Select("[ParentId]=" + ParentId);”
    不太明白是什么意思,我运行之后的结果好像输出的是ID的值1,“if(dv[i].Table.Select("[ParentId] = " + dv[i]["id"]).Length > 0)"这句话又怎么理解?若孟大哥有关注我的贴子望请赐教!!
      

  15.   

    xmlDoc.SelectSingleNode(string.Format(@"//node[@ID='{0}']", md.Reader["ParentID"])).AppendChild(node);
    把新生成的node节点,添加到ID=当前记录的ParentID的元素下面,做为其子节点。
      

  16.   

    好的dalmeeme大哥,我想一句话一句话的弄清楚是什么意思string.Format方法是把将指定的 String 中的格式项替换为指定的 Object 实例的值的文本等效项
    string.Format(@"//node[@ID='{0}']", md.Reader["ParentID"])是什么意思?
      

  17.   

    好的dalmeeme大哥,我想完全理解你的代码
    我在网上查过string.Format(string,object)方法是把将指定的 String 中的格式项替换为指定的 Object 实例的值的文本等效项
    那小妹愚钝请问这名话:
    string.Format(@"//node[@ID='{0}']", md.Reader["ParentID"])是什么意思? 
    然后这句话又放到了XMLDocument中的SelectSingerNode当中,这好像一环接着一环不知是什么意思?
      

  18.   

    string.Format(@"//node[@ID='{0}']", md.Reader["ParentID"])//node[@ID='1']这个是xpath表达式,选取文档中ID属性值等于'1'的node节点。XPath语法参见:http://www.w3school.com.cn/xpath/xpath_syntax.asp
      

  19.   

    搞xml,你需要掌握xpath的知识。xpath就是类似数据库的sql,用来查询xml中的数据用的,。
      

  20.   

    孟大哥,对于xpath我正在努力学习;但小妹有另外一件事想向你请教!
    这个http://dotnet.aspx.cc/file/Recursion-Genernate-XML.aspx路径是您给我参考的,其中有一段代码“DataRow[] dv = t.Select("[ParentId]=" + ParentId);”我用以下的代码:
     DataRow[] dv = dt.Select("[ParentId]="+0);
            for (int i = 0; i < dv.Length; i++)
            {
                Response.Write(dv[i][0]);
            }
    运行出来的结果输出的是ID的值1
    “if(dv[i].Table.Select("[ParentId] = " + dv[i]["id"]).Length > 0)" 中dv[i]["id"]是什么意思呢?怎么理解,请赐教!谢谢
      

  21.   

    孟大哥,对于xpath我正在努力学习;但小妹有另外一件事想向你请教!
    这个http://dotnet.aspx.cc/file/Recursion-Genernate-XML.aspx路径是您给我参考的,其中有一段代码“DataRow[] dv = t.Select("[ParentId]=" + ParentId);”我用以下的代码:
     DataRow[] dv = dt.Select("[ParentId]="+0);
      for (int i = 0; i < dv.Length; i++)
      {
      Response.Write(dv[i][0]);
      }
    运行出来的结果输出的是ID的值1
    DataRow[] dv = t.Select("[ParentId]=" + ParentId);
       for (int i = 0; i < dv.Length; i++)
       {
         if (dv[i].Table.Select("[ParentId] = " + dv[i]["id"]).Length > 0)dv[i]["id"]是什么意思呢?它有值吗?请赐教!谢谢
     
      

  22.   

    用DataSet得到数据,然后使用GetXml()
      

  23.   

    谢谢各位的帮忙,特别是孟大哥和dalmeeme大哥,非常感谢你们两位的代码,小妹仔细运行都很成功!