我有一个dataset,里面有两张表,两个表是父子关系。
目录和产品, 一个目录对应多个产品。
我想输出XML, 使用dataset.writeXML 方法。
在dataset里面应该如何设定这样的关系,
或者写XML的时候应该怎么处理。
才能保证写出的XML文件是这样的:
<NewDataSet>
  <Categories>
    <CategoryID>1</CategoryID>
    <CategoryName>Beverages</CategoryName>
 <Products>
    <CategoryID>1</CategoryID>
    <ProductID>1</ProductID>
    <ProductName>Chai</ProductName>
  </Products>
  <Products>
    <CategoryID>1</CategoryID>
    <ProductID>2</ProductID>
    <ProductName>Chang</ProductName>
  </Products>
  </Categories>
  <Categories>
    <CategoryID>2</CategoryID>
    <CategoryName>Condiments</CategoryName>
<Products>
<CategoryID>2</CategoryID>
<ProductID>3</ProductID>
<ProductName>Aniseed Syrup</ProductName>
</Products>
<Products>
<CategoryID>2</CategoryID>
<ProductID>4</ProductID>
<ProductName>Chef Anton's Cajun Seasoning</ProductName>
</Products>
<Products>
<CategoryID>2</CategoryID>
<ProductID>5</ProductID>
<ProductName>Chef Anton's Gumbo Mix</ProductName>
</Products>
<Products>
<CategoryID>2</CategoryID>
<ProductID>6</ProductID>
<ProductName>Grandma's Boysenberry Spread</ProductName>
</Products>
  </Categories>
</NewDataSet>

解决方案 »

  1.   

    假如你用dataset.writeXML 想写出你要的格式是不能实现的.
    只能用自己写的的方法去实现了
      

  2.   

    如果DataSet里的DataTable之间有Relation的话,在WriteXml的时候,xml里会帮你简单这种Relation,下次在把xml转化成DataSet的时候,这种Relation的关系会自动帮你重建。
      

  3.   

    dataset有方法ReadXmlSchema 将 XML 架构读入 DataSet
    限定义架构,再用这个方法导入
      

  4.   

    可以的,我试了一下,代码如下:
    System.Data.DataSet ds = new DataSet("test");
    ds.Tables.Add("a");
    ds.Tables[0].Columns.Add("a1");
    ds.Tables[0].Columns.Add("a2");
    System.Data.DataRow r1 = ds.Tables[0].NewRow();
    r1.BeginEdit();
    r1[0] = "1";
    r1[1] = "aa";
    r1.EndEdit();
    ds.Tables[0].Rows.Add(r1);
    r1 = ds.Tables[0].NewRow();
    r1.BeginEdit();
    r1[0] = "2";
    r1[1] = "bb";
    r1.EndEdit();
    ds.Tables[0].Rows.Add(r1);
    System.Data.DataColumn c1 = ds.Tables[0].Columns[0];
    ds.Tables.Add("b");
    ds.Tables[1].Columns.Add("b1");
    ds.Tables[1].Columns.Add("b2");
    ds.Tables[1].Columns.Add("b3");
    System.Data.DataRow r2 = ds.Tables[1].NewRow();
    r2.BeginEdit();
    r2[0] = "1";
    r2[1] = "b11";
    r2[2] = "b12";
    r2.EndEdit();
    ds.Tables[1].Rows.Add(r2);
    r2 = ds.Tables[1].NewRow();
    r2.BeginEdit();
    r2[0] = "1";
    r2[1] = "b21";
    r2[2] = "b22";
    r2.EndEdit();
    ds.Tables[1].Rows.Add(r2);
    r2 = ds.Tables[1].NewRow();
    r2.BeginEdit();
    r2[0] = "1";
    r2[1] = "b31";
    r2[2] = "b32";
    r2.EndEdit();
    ds.Tables[1].Rows.Add(r2);
    r2 = ds.Tables[1].NewRow();
    r2.BeginEdit();
    r2[0] = "2";
    r2[1] = "b41";
    r2[2] = "b42";
    r2.EndEdit();
    ds.Tables[1].Rows.Add(r2);
    System.Data.DataColumn c2 = ds.Tables[1].Columns[0];
    ds.Relations.Add("r1",c1,c2);
    ds.Relations[0].Nested=true;
    MessageBox.Show(ds.GetXml());
    主要是设ds.Relations.Add("r1",c1,c2);
    ds.Relations[0].Nested=true;
      

  5.   

    根据楼主提供的代码进行完整测试,关键是设置
    DataRelation.Nested 属性,如果 DataRelation 对象嵌套,则为 true;否则为 false。
    无论输入的xml文件是下面的其中之一,
    (1)第一种方式为嵌套
    <NewDataSet>
    <Categories>
    <CategoryID>1</CategoryID>
    <CategoryName>Beverages</CategoryName>
    <Products>
    <CategoryID>1</CategoryID>
    <ProductID>1</ProductID>
    <ProductName>Chai</ProductName>
    </Products>
    <Products>
    <CategoryID>1</CategoryID>
    <ProductID>2</ProductID>
    <ProductName>Chang</ProductName>
    </Products>
    </Categories>
    <Categories>
    <CategoryID>2</CategoryID>
    <CategoryName>Condiments</CategoryName>
    <Products>
    <CategoryID>2</CategoryID>
    <ProductID>3</ProductID>
    <ProductName>Aniseed Syrup</ProductName>
    </Products>
    <Products>
    <CategoryID>2</CategoryID>
    <ProductID>4</ProductID>
    <ProductName>Chef Anton's Cajun Seasoning</ProductName>
    </Products>
    </Categories>
    </NewDataSet>
    (2)第二种方式为非嵌套,
    <NewDataSet>
    <Categories>
    <CategoryID>1</CategoryID>
    <CategoryName>Beverages</CategoryName>
    </Categories>
    <Categories>
    <CategoryID>2</CategoryID>
    <CategoryName>Condiments</CategoryName>
    </Categories>
    <Products>
    <CategoryID>1</CategoryID>
    <ProductID>1</ProductID>
    <ProductName>Chai</ProductName>
    </Products>
    <Products>
    <CategoryID>1</CategoryID>
    <ProductID>2</ProductID>
    <ProductName>Chang</ProductName>
    </Products>
    <Products>
    <CategoryID>2</CategoryID>
    <ProductID>3</ProductID>
    <ProductName>Aniseed Syrup</ProductName>
    </Products>
    <Products>
    <CategoryID>2</CategoryID>
    <ProductID>4</ProductID>
    <ProductName>Chef Anton's Cajun Seasoning</ProductName>
    </Products>
    </NewDataSet>
    使用下面测试代码,
    /*------------------------------------------------
    http://blog.csdn.net/zhzuo        
    --------------------------------------------------*/
    namespace Zhzuo.VS2005Test.ConsoleTest
    {
        class Program
        {
            static void Main(string[] args)
            {
                DataSet ds = new DataSet("NewDataSet");
                DataTable CategoryDT = new DataTable("Categories");//目录表
                CategoryDT.Columns.Add("CategoryID", typeof(int));//PK
                CategoryDT.Columns.Add("CategoryName", typeof(string));
                CategoryDT.PrimaryKey = new DataColumn[] { CategoryDT.Columns["CategoryID"] };
                ds.Tables.Add(CategoryDT);            DataTable ProductDT = new DataTable("Products");//目录表
                ProductDT.Columns.Add("ProductID", typeof(int));//PK            
                ProductDT.Columns.Add("ProductName", typeof(string));
                ProductDT.Columns.Add("CategoryID", typeof(int));//FK
                ProductDT.PrimaryKey = new DataColumn[] { ProductDT.Columns["ProductID"] };
                ds.Tables.Add(ProductDT);            DataRelation dr = new DataRelation("关系名称",
                        ds.Tables["Categories"].Columns["CategoryID"], ds.Tables["Products"].Columns["CategoryID"], true);
                dr.Nested = true;//设置DataRelation 对象嵌套。
                ds.Relations.Add(dr);            ds.ReadXml("c:\\test_in.xml");
                ds.WriteXml("c:\\test_out.xml");           
                //Console.ReadLine();
            }       
        }  
    }最终输出结果都由dr.Nested = true;生成嵌套输出。
    <?xml version="1.0" standalone="yes"?>
    <NewDataSet>
      <Categories>
        <CategoryID>1</CategoryID>
        <CategoryName>Beverages</CategoryName>
        <Products>
          <ProductID>1</ProductID>
          <ProductName>Chai</ProductName>
          <CategoryID>1</CategoryID>
        </Products>
        <Products>
          <ProductID>2</ProductID>
          <ProductName>Chang</ProductName>
          <CategoryID>1</CategoryID>
        </Products>
      </Categories>
      <Categories>
        <CategoryID>2</CategoryID>
        <CategoryName>Condiments</CategoryName>
        <Products>
          <ProductID>3</ProductID>
          <ProductName>Aniseed Syrup</ProductName>
          <CategoryID>2</CategoryID>
        </Products>
        <Products>
          <ProductID>4</ProductID>
          <ProductName>Chef Anton's Cajun Seasoning</ProductName>
          <CategoryID>2</CategoryID>
        </Products>
      </Categories>
    </NewDataSet>