pkID        CateName        CatePath        
1           首页            ,0,
2           新闻            ,0,
3           产品            ,0,
4           案例            ,0,
5           国际            ,0,2,
6           国内            ,0,2,
7           本地            ,0,2,
8           行业            ,0,2,1.我使用的是递归查询(因为树的级数是无限的)。
2.先构造一个DataTable:
    DataTable dtx = new DataTable("CateList");
    dtx.Columns.Add(new DataColumn("pkID", typeof(int)));
    dtx.Columns.Add(new DataColumn("CateName", typeof(string)));
    dtx.Columns.Add(new DataColumn("CatePath", typeof(string)));
    dtx.Columns.Add(new DataColumn("CateList", typeof(DataTable)));//这里方便装入下一级的DataTable。
3.数据库中查询出来以后,装入DataTable。
4.将DataTable转化为DataSet。
5.用DataSet.WriteXML()输出XML;结果是,顶级的没有Schema,但子级的Schema不能控制。
请问是什么原因?
还有无其它办法?

解决方案 »

  1.   

    分析了一下DataSet.ReadXML读入数据时存放的结构,大概明白了。
      

  2.   

    pkID CateName CatePath   
    1 首页 ,0,
    2 新闻 ,0,
    3 产品 ,0,
    4 案例 ,0,
    5 国际 ,0,2,
    6 国内 ,0,2,
    7 本地 ,0,2,
    8 行业 ,0,2,
    LZ 下面几行的数据多一列了
      

  3.   

    http://support.microsoft.com/kb/316260
    找到一遍文章,但是VB的,看不懂,谁能把它翻译成C#的?谢谢。
      

  4.   

    意思就是,要输出多级结构的XML,如:
    <CateList>
        <pkID>1</pkID>
        <CateName>首页</CateName>
        <CatePath>,0,</CatePath>
    </CateList>
    <CateList>
        <pkID>2</pkID>
        <CateName>新闻</CateName>
        <CatePath>,0,</CatePath>
        <CateList>
            <pkID>5</pkID>
            <CateName>国际</CateName>
            <CatePath>,0,2,</CatePath>
        </CateList>
        <CateList>
            <pkID>6</pkID>
            <CateName>国内</CateName>
            <CatePath>,0,2,</CatePath>
        </CateList>
        <CateList>
            <pkID>7</pkID>
            <CateName>本地</CateName>
            <CatePath>,0,2,</CatePath>
        </CateList>
        <CateList>
            <pkID>8</pkID>
            <CateName>行业</CateName>
            <CatePath>,0,2,</CatePath>
        </CateList>
    </CateList>
    <CateList>
        <pkID>3</pkID>
        <CateName>产品</CateName>
        <CatePath>,0,</CatePath>
    </CateList>
    <CateList>
        <pkID>4</pkID>
        <CateName>案例</CateName>
        <CatePath>,0,</CatePath>
    </CateList>
      

  5.   

    我的想法是,先构造一个DataSet,然后WriteXM就可以了,不用其它方法那么麻烦。
      

  6.   

    恩 先前也碰到过这问题  ,DataSet是二维表表结构 ,没想到好的方法,改用其他方式处理了
      

  7.   

    DataSet.Relations,是否可以解决这个问题?
    朋友们是否可以做一个示范?谢谢。
      

  8.   

    http://msdn.microsoft.com/zh-cn/library/89tyw6dw(VS.80).aspx看看这个吧  
      

  9.   

    http://support.microsoft.com/kb/316260
    这文章不难啊!
    创建二个DataTable表,并加入DataSet中,同时在两个DataTable表建立关系。
      

  10.   

    http://msdn.microsoft.com/zh-cn/library/1t4362sd(v=VS.80).aspx这一篇才是  ,看下行不?
      

  11.   

    上面一篇是XmlDataDocument与DataSet
      

  12.   

    不行,分不了层,试过了的。//建立数据集对象,像数据库一样
    DataSet ds = new DataSet();
    //建立表
    DataTable dtsb = new DataTable("SB");
    DataTable dtsx = new DataTable("SX");
    //SB主表,创建列
    dtsb.Columns.Add(new DataColumn("学号"));
    dtsb.Columns.Add(new DataColumn("姓名"));
    dtsb.Columns.Add(new DataColumn("性别"));
    dtsb.Columns.Add(new DataColumn("总成绩"));
    //SX从表,创建列
    dtsx.Columns.Add(new DataColumn("学号"));
    dtsx.Columns.Add(new DataColumn("姓名"));
    dtsx.Columns.Add(new DataColumn("科目"));
    dtsx.Columns.Add(new DataColumn("分成绩"));
    //主表数据,创建行
    dtsb.Rows.Add("1", "陈一", "男", "100");
    dtsb.Rows.Add("2", "王二", "女", "90");
    dtsb.Rows.Add("3", "李三", "女", "80");
    dtsb.Rows.Add("4", "赵四", "男", "70");
    //从表数据,创建行
    dtsx.Rows.Add("1", "陈一", "数学", "50");
    dtsx.Rows.Add("2", "王二", "数学", "90");
    dtsx.Rows.Add("3", "李三", "历史", "50");
    dtsx.Rows.Add("3", "李三", "地理", "30");
    dtsx.Rows.Add("4", "赵四", "英文", "70");
    ds.Tables.Add(dtsb);
    ds.Tables.Add(dtsx);
    ds.Relations.Add("SBX", ds.Tables["SB"].Columns["学号"], ds.Tables["SX"].Columns["学号"]);
    ds.GetXml();
    uc.WriteXml(ds);
      

  13.   

    生成的XML效果是:
    <?xml version="1.0" encoding="utf-8" ?> 
    - <NewDataSet>
    - <SB>
      <学号>1</学号> 
      <姓名>陈一</姓名> 
      <性别>男</性别> 
      <总成绩>100</总成绩> 
      </SB>
    - <SB>
      <学号>2</学号> 
      <姓名>王二</姓名> 
      <性别>女</性别> 
      <总成绩>90</总成绩> 
      </SB>
    - <SB>
      <学号>3</学号> 
      <姓名>李三</姓名> 
      <性别>女</性别> 
      <总成绩>80</总成绩> 
      </SB>
    - <SB>
      <学号>4</学号> 
      <姓名>赵四</姓名> 
      <性别>男</性别> 
      <总成绩>70</总成绩> 
      </SB>
    - <SX>
      <学号>1</学号> 
      <姓名>陈一</姓名> 
      <科目>数学</科目> 
      <分成绩>50</分成绩> 
      </SX>
    - <SX>
      <学号>2</学号> 
      <姓名>王二</姓名> 
      <科目>数学</科目> 
      <分成绩>90</分成绩> 
      </SX>
    - <SX>
      <学号>3</学号> 
      <姓名>李三</姓名> 
      <科目>历史</科目> 
      <分成绩>50</分成绩> 
      </SX>
    - <SX>
      <学号>3</学号> 
      <姓名>李三</姓名> 
      <科目>地理</科目> 
      <分成绩>30</分成绩> 
      </SX>
    - <SX>
      <学号>4</学号> 
      <姓名>赵四</姓名> 
      <科目>英文</科目> 
      <分成绩>70</分成绩> 
      </SX>
      </NewDataSet>
      

  14.   

    我要的效果:
    <?xml version="1.0" encoding="utf-8"?>
    <NewDataSet>
    <SB>
    <学号>1</学号>
    <姓名>陈一</姓名>
    <性别>男</性别>
    <总成绩>100</总成绩>
    <成绩>
    <数学>50</数学>
    </成绩>
    </SB>
    <SB>
    <学号>2</学号>
    <姓名>王二</姓名>
    <性别>女</性别>
    <总成绩>90</总成绩>
    <成绩>
    <数学>90</数学>
    </成绩>
    </SB>
    <SB>
    <学号>3</学号>
    <姓名>李三</姓名>
    <性别>女</性别>
    <总成绩>80</总成绩>
    <成绩>
    <历史>50</历史>
    <地理>30</地理>
    </成绩>
    </SB>
    <SB>
    <学号>4</学号>
    <姓名>赵四</姓名>
    <性别>男</性别>
    <总成绩>70</总成绩>
    <成绩>
    <英文>70</英文>
    </成绩>
    </SB>
    </NewDataSet>
      

  15.   


     //建立数据集对象,像数据库一样
                DataSet ds = new DataSet();
                //建立表
                DataTable dtsb = new DataTable("SB");
                DataTable dtsx = new DataTable("SX");
                //SB主表,创建列
                dtsb.Columns.Add(new DataColumn("学号"));
                dtsb.Columns.Add(new DataColumn("姓名"));
                dtsb.Columns.Add(new DataColumn("性别"));
                dtsb.Columns.Add(new DataColumn("总成绩"));
                //SX从表,创建列
                dtsx.Columns.Add(new DataColumn("学号"));
                dtsx.Columns.Add(new DataColumn("姓名"));
                dtsx.Columns.Add(new DataColumn("科目"));
                dtsx.Columns.Add(new DataColumn("分成绩"));
                //主表数据,创建行
                dtsb.Rows.Add("1", "陈一", "男", "100");
                dtsb.Rows.Add("2", "王二", "女", "90");
                dtsb.Rows.Add("3", "李三", "女", "80");
                dtsb.Rows.Add("4", "赵四", "男", "70");
                //从表数据,创建行
                dtsx.Rows.Add("1", "陈一", "数学", "50");
                dtsx.Rows.Add("2", "王二", "数学", "90");
                dtsx.Rows.Add("3", "李三", "历史", "50");
                dtsx.Rows.Add("3", "李三", "地理", "30");
                dtsx.Rows.Add("4", "赵四", "英文", "70");
                ds.Tables.Add(dtsb);
                ds.Tables.Add(dtsx);
                ds.Relations.Add("SBX", ds.Tables["SB"].Columns["学号"], ds.Tables["SX"].Columns["学号"]);
                XmlDataDocument xmlDoc = new XmlDataDocument(ds);
                xmlDoc.Save(@"test1.xml");test1.xml生成的内容<NewDataSet>
      <SB>
        <学号>1</学号>
        <姓名>陈一</姓名>
        <性别>男</性别>
        <总成绩>100</总成绩>
      </SB>
      <SB>
        <学号>2</学号>
        <姓名>王二</姓名>
        <性别>女</性别>
        <总成绩>90</总成绩>
      </SB>
      <SB>
        <学号>3</学号>
        <姓名>李三</姓名>
        <性别>女</性别>
        <总成绩>80</总成绩>
      </SB>
      <SB>
        <学号>4</学号>
        <姓名>赵四</姓名>
        <性别>男</性别>
        <总成绩>70</总成绩>
      </SB>
      <SX>
        <学号>1</学号>
        <姓名>陈一</姓名>
        <科目>数学</科目>
        <分成绩>50</分成绩>
      </SX>
      <SX>
        <学号>2</学号>
        <姓名>王二</姓名>
        <科目>数学</科目>
        <分成绩>90</分成绩>
      </SX>
      <SX>
        <学号>3</学号>
        <姓名>李三</姓名>
        <科目>历史</科目>
        <分成绩>50</分成绩>
      </SX>
      <SX>
        <学号>3</学号>
        <姓名>李三</姓名>
        <科目>地理</科目>
        <分成绩>30</分成绩>
      </SX>
      <SX>
        <学号>4</学号>
        <姓名>赵四</姓名>
        <科目>英文</科目>
        <分成绩>70</分成绩>
      </SX>
    </NewDataSet>
      

  16.   

    我要的效果:
    <?xml version="1.0" encoding="utf-8"?>
    <NewDataSet>
    <SB>
    <学号>1</学号>
    <姓名>陈一</姓名>
    <性别>男</性别>
    <总成绩>100</总成绩>
    <成绩>
    <数学>50</数学>
    </成绩>
    </SB>
    <SB>
    <学号>2</学号>
    <姓名>王二</姓名>
    <性别>女</性别>
    <总成绩>90</总成绩>
    <成绩>
    <数学>90</数学>
    </成绩>
    </SB>
    <SB>
    <学号>3</学号>
    <姓名>李三</姓名>
    <性别>女</性别>
    <总成绩>80</总成绩>
    <成绩>
    <历史>50</历史>
    <地理>30</地理>
    </成绩>
    </SB>
    <SB>
    <学号>4</学号>
    <姓名>赵四</姓名>
    <性别>男</性别>
    <总成绩>70</总成绩>
    <成绩>
    <英文>70</英文>
    </成绩>
    </SB>
    </NewDataSet>
      

  17.   

    我要的效果:
    <?xml version="1.0" encoding="utf-8"?>
    <NewDataSet>
    <SB>
    <学号>1</学号>
    <姓名>陈一</姓名>
    <性别>男</性别>
    <总成绩>100</总成绩>
    <成绩>
    <数学>50</数学>
    </成绩>
    </SB>
    <SB>
    <学号>2</学号>
    <姓名>王二</姓名>
    <性别>女</性别>
    <总成绩>90</总成绩>
    <成绩>
    <数学>90</数学>
    </成绩>
    </SB>
    <SB>
    <学号>3</学号>
    <姓名>李三</姓名>
    <性别>女</性别>
    <总成绩>80</总成绩>
    <成绩>
    <历史>50</历史>
    <地理>30</地理>
    </成绩>
    </SB>
    <SB>
    <学号>4</学号>
    <姓名>赵四</姓名>
    <性别>男</性别>
    <总成绩>70</总成绩>
    <成绩>
    <英文>70</英文>
    </成绩>
    </SB>
    </NewDataSet>
      

  18.   

     XmlDataDocument xmlDoc = new XmlDataDocument(ds);
    XmlDeclaration xmlDecl = xmlDoc.CreateXmlDeclaration("1.0", "utf-8", "yes");
    xmlDoc.InsertBefore(xmlDecl, xmlDoc.DocumentElement); xmlDoc.Save(@"test1.xml");试下
      

  19.   

    protected void Page_Load(object sender, EventArgs e)
    {
    //建立数据集对象,像数据库一样
    DataSet ds = new DataSet();
    //建立表
    DataTable dtx = new DataTable("Sx");
    DataTable dty = new DataTable("Sy");
    //dtx主表,创建列
    dtx.Columns.Add(new DataColumn("学号", typeof(int)));
    dtx.Columns.Add(new DataColumn("姓名", typeof(string)));
    dtx.Columns.Add(new DataColumn("成绩", typeof(DataTable)));
    //dty从表,创建列
    dty.Columns.Add(new DataColumn("学号", typeof(int)));
    dty.Columns.Add(new DataColumn("科目", typeof(string)));
    dty.Columns.Add(new DataColumn("成绩", typeof(string)));
    //从表数据,创建行
    DataRow dry = dty.NewRow();
    dry["学号"] = 1;//陈一的id
    dry["科目"] = "语文";
    dry["成绩"] = "90";
    dty.Rows.Add(dry);
    dry = dty.NewRow();
    dry["学号"] = 1;//陈一的id
    dry["科目"] = "数学";
    dry["成绩"] = "80";
    dty.Rows.Add(dry);
    //主表数据,创建行
    DataRow drx = dtx.NewRow();
    drx["学号"] = 1;//陈一
    drx["姓名"] = "陈一";
    drx["成绩"] = dty;//将陈一的成绩全部存入
    dtx.Rows.Add(drx);
    //主表数据,创建行
    drx = dtx.NewRow();
    drx["学号"] = 2;
    drx["姓名"] = "王二";
    drx["成绩"] = null;
    dtx.Rows.Add(drx); ds.Tables.Add(dtx);
    WriteXml(ds);
    }
    public void WriteXml(DataSet ds)
    {
    XmlTextWriter writer = new XmlTextWriter(Response.OutputStream, System.Text.Encoding.GetEncoding("utf-8"));
    writer.Formatting = Formatting.Indented;
    writer.Indentation = 1;
    writer.IndentChar = ' ';
    writer.WriteStartDocument();
    ds.WriteXml(writer);
    writer.Flush();
    writer.Close();
    Response.ContentType = "text/xml";
    Response.End();
    }
    看看这个结果就知道我要的是什么啦。
      

  20.   

    protected void Page_Load(object sender, EventArgs e)
    {
    //建立数据集对象,像数据库一样
    DataSet ds = new DataSet();
    //建立表
    DataTable dtx = new DataTable("Sx");
    DataTable dty = new DataTable("Sy");
    //dtx主表,创建列
    dtx.Columns.Add(new DataColumn("学号", typeof(int)));
    dtx.Columns.Add(new DataColumn("姓名", typeof(string)));
    dtx.Columns.Add(new DataColumn("成绩", typeof(DataTable)));
    //dty从表,创建列
    dty.Columns.Add(new DataColumn("学号", typeof(int)));
    dty.Columns.Add(new DataColumn("科目", typeof(string)));
    dty.Columns.Add(new DataColumn("成绩", typeof(string)));
    //从表数据,创建行
    DataRow dry = dty.NewRow();
    dry["学号"] = 1;//陈一的id
    dry["科目"] = "语文";
    dry["成绩"] = "90";
    dty.Rows.Add(dry);
    dry = dty.NewRow();
    dry["学号"] = 1;//陈一的id
    dry["科目"] = "数学";
    dry["成绩"] = "80";
    dty.Rows.Add(dry);
    //主表数据,创建行
    DataRow drx = dtx.NewRow();
    drx["学号"] = 1;//陈一
    drx["姓名"] = "陈一";
    drx["成绩"] = dty;//将陈一的成绩全部存入,注意是DataTable类型。
    dtx.Rows.Add(drx);
    //主表数据,创建行
    drx = dtx.NewRow();
    drx["学号"] = 2;
    drx["姓名"] = "王二";
    drx["成绩"] = null;
    dtx.Rows.Add(drx); ds.Tables.Add(dtx);
    WriteXml(ds);
    }
    public void WriteXml(DataSet ds)
    {
    XmlTextWriter writer = new XmlTextWriter(Response.OutputStream, System.Text.Encoding.GetEncoding("utf-8"));
    writer.Formatting = Formatting.Indented;
    writer.Indentation = 1;
    writer.IndentChar = ' ';
    writer.WriteStartDocument();
    ds.WriteXml(writer);
    writer.Flush();
    writer.Close();
    Response.ContentType = "text/xml";
    Response.End();
    }
    看看这个结果就知道我要的是什么啦。
      

  21.   

    都已经用xml了为什么还坚持用关系型数据库的方式保存。xml就是个天然的树吧。
      

  22.   

    因为原来就是个数据库,要读出来,生成规范的XML,分层的,要能体现主从关系的。
      

  23.   

    <CateList>
        <pkID>1</pkID>
        <CateName>首页</CateName>
        <CatePath>,0,</CatePath>
    </CateList>
    <CateList>
        <pkID>2</pkID>
        <CateName>新闻</CateName>
        <CatePath>,0,</CatePath>
        <CateList>
            <pkID>5</pkID>
            <CateName>国际</CateName>
            <CatePath>,0,2,</CatePath>
        </CateList>
        <CateList>
            <pkID>6</pkID>
            <CateName>国内</CateName>
            <CatePath>,0,2,</CatePath>
        </CateList>
        <CateList>
            <pkID>7</pkID>
            <CateName>本地</CateName>
            <CatePath>,0,2,</CatePath>
        </CateList>
        <CateList>
            <pkID>8</pkID>
            <CateName>行业</CateName>
            <CatePath>,0,2,</CatePath>
        </CateList>
    </CateList>
    <CateList>
        <pkID>3</pkID>
        <CateName>产品</CateName>
        <CatePath>,0,</CatePath>
    </CateList>
    <CateList>
        <pkID>4</pkID>
        <CateName>案例</CateName>
        <CatePath>,0,</CatePath>
    </CateList>
    我用ReadXML读取到DataSet,然后再用for显示该DataSet,发现生成了两个额外的列:
    Start_Id和Start_Id_0。有要是用来描述主从关系的。接下来,我在构造DataSet时,也加入了这两列,但是还是不行的。
      

  24.   

    <CateList>
        <pkID>1</pkID>
        <CateName>首页</CateName>
        <CatePath>,0,</CatePath>
    </CateList>
    <CateList>
        <pkID>2</pkID>
        <CateName>新闻</CateName>
        <CatePath>,0,</CatePath>
        <CateList>
            <pkID>5</pkID>
            <CateName>国际</CateName>
            <CatePath>,0,2,</CatePath>
        </CateList>
        <CateList>
            <pkID>6</pkID>
            <CateName>国内</CateName>
            <CatePath>,0,2,</CatePath>
        </CateList>
        <CateList>
            <pkID>7</pkID>
            <CateName>本地</CateName>
            <CatePath>,0,2,</CatePath>
        </CateList>
        <CateList>
            <pkID>8</pkID>
            <CateName>行业</CateName>
            <CatePath>,0,2,</CatePath>
        </CateList>
    </CateList>
    <CateList>
        <pkID>3</pkID>
        <CateName>产品</CateName>
        <CatePath>,0,</CatePath>
    </CateList>
    <CateList>
        <pkID>4</pkID>
        <CateName>案例</CateName>
        <CatePath>,0,</CatePath>
    </CateList>
    我用ReadXML读取到DataSet,然后再用for显示该DataSet,发现生成了两个额外的列:
    Start_Id和Start_Id_0。有要是用来描述主从关系的。接下来,我在构造DataSet时,也加入了这两列,但是还是不行的。