简体   繁体   English

如何在不循环的情况下从数据表或数据集创建嵌套XML?

[英]How to create nested XML from datatable or dataset without looping?

I want to create nested XML from DataTable without loop. 我想在没有循环的情况下从DataTable创建嵌套XML。

DataTable: Employee DataTable:员工 在此输入图像描述

I had tried the following code snippet 我曾尝试过以下代码段

DataSet ds=new DataSet ("EmployeeDetails");
DataTable dtConvert = datatable to be converted
ds.Tables.Add(dtConvert);
ds.WriteXml("sample.txt");

and got the XML which looks like, 并得到了看起来像的XML,

<EmployeeDetails>
  <Employee>
    <name>John</name>
    <city>chennai</city>
    <state>Tamilnadu</state>
    <country>India</country>
  </Employee>
  <Employee>
    <name>David</name>
    <city>Bangalore</city>
    <state>Karnataka</state>
    <country>India</country>
  </Employee>
</EmployeeDetails>

But the XML format I want is 但我想要的XML格式是

<EmployeeDetails>
  <Employee>
    <name>John</name>
    <address>
        <city>chennai</city>
        <state>Tamilnadu</state>
        <country>India</country>
    </address>
  </Employee>
  <Employee>
    <name>David</name>
    <address>
        <city>Bangalore</city>
        <state>Karnataka</state>
        <country>India</country>
    </address>
  </Employee>
</EmployeeDetails>

Can anyone please guide me to do this in a best way? 谁能指导我以最好的方式做到这一点?

        DataSet ds = new DataSet("EmployeeList");

        //create table address
        DataTable address = new DataTable("Address");
        DataColumn column;

        //add column id
        column = new DataColumn();
        column.DataType = System.Type.GetType("System.Int32");
        column.ColumnName  = "ID";
        address.Columns.Add(column);
        //address.PrimaryKey = new DataColumn[1] { column };

        //add column City
        column = new DataColumn();
        column.DataType = System.Type.GetType("System.String");
        column.ColumnName = "City";
        address.Columns.Add(column);

        //add column State
        column = new DataColumn();
        column.DataType = System.Type.GetType("System.String");
        column.ColumnName = "State";
        address.Columns.Add(column);

        //add column Country
        column = new DataColumn();
        column.DataType = System.Type.GetType("System.String");
        column.ColumnName = "Country";
        address.Columns.Add(column);

        ds.Tables.Add(address); //add table address to dataset

        //create table employee
        DataTable employee = new DataTable("Employee");

        //add column ID
        column = new DataColumn();
        column.DataType = System.Type.GetType("System.Int32");
        column.ColumnName = "ID";
        employee.Columns.Add(column);
        employee.PrimaryKey = new DataColumn[1] { column };

        //add column Name
        column = new DataColumn();
        column.DataType = System.Type.GetType("System.String");
        column.ColumnName = "Name";
        employee.Columns.Add(column);

        //add column Address
        //column = new DataColumn();
        //column.DataType = System.Type.GetType("System.Int32");
        //column.ColumnName = "Address";
        //employee.Columns.Add(column);

        ds.Tables.Add(employee); //add table employee to dataset

        //set foreign key constraint
        //ForeignKeyConstraint fk = new ForeignKeyConstraint("AddressFK", 
        //ds.Tables["Address"].Columns["ID"], ds.Tables["Employee"].Columns["Address"]);

        //fk.DeleteRule = Rule.None;
        //ds.Tables["Employee"].Constraints.Add(fk);

        //
        // fill data to data set
        //
        DataRow row;
        row = address.NewRow();
        row["ID"] = 1;
        row["City"] = "test";
        row["State"] = "test";
        row["Country"] = "test";

        address.Rows.Add(row);

        row = employee.NewRow();
        row["Name"] = "abc";
        row["ID"] = 1;
        //row["Address"] = 1;

        employee.Rows.Add(row);

        DataRelation relation = ds.Relations.Add("relation", ds.Tables["Employee"].Columns["ID"], ds.Tables["Address"].Columns["ID"]);
        relation.Nested = true;

        ds.WriteXml("test.txt"); //create xml from dataset

What I'm trying to do here is creating 2 tables Employee and Address . 我在这里要做的是创建2个表EmployeeAddress Address has 4 columns ID - foreign key that refer to Employee primary key, State , City , Country . Address有4列ID - 指向Employee主键, StateCityCountry外键。 Employee has 2 columns Name , ID - primary key. Employee有2列NameID - 主键。 Then add those tables to dataset ds . 然后将这些表添加到数据集ds Finally, create xml from ds . 最后,从ds创建xml。

P/S: I write this in pure text (without using IDE because this computer doesn't has any IDE :(, so if any error on typo or syntax, please let me know) P / S:我用纯文本写这个(不使用IDE,因为这台计算机没有任何IDE :(,如果有任何关于拼写错误或语法的错误,请告诉我)

UPDATE I updated the code, now the result XML will look like this: 更新我更新了代码,现在结果XML将如下所示:

<?xml version="1.0" standalone="yes"?>
<EmployeeList>
  <Employee>
    <ID>1</ID>
    <Name>abc</Name>
    <Address>
      <ID>1</ID>
      <City>test</City>
      <State>test</State>
      <Country>test</Country>
    </Address>
  </Employee>
</EmployeeList>

I made a mistake with the relationship from last time, it should be a foreign key in address that refer to employee primary key (in this case, I user column ID ) 我上次与关系犯了一个错误,它应该是一个引用employee主键的address中的外键(在这种情况下,我是用户列ID

UPDATE2 to exclude ID from Address , add this line right before you call ds.WriteXML("test.xml") UPDATE2Address排除ID,在调用ds.WriteXML("test.xml")之前添加此行

ds.Tables["Address"].Columns["ID"].ColumnMapping = MappingType.Hidden;

You can also add following line to exclude ID from employee as well: 您还可以添加以下行以从员工中排除ID:

ds.Tables["Employee"].Columns["ID"].ColumnMapping = MappingType.Hidden;

The main problem you have is that you're taking 1 DataTable and trying to break it into 2 Related DataTables. 您遇到的主要问题是您正在使用1个DataTable并尝试将其分解为2个相关数据表。 The best method would be to break out your table so you have an Employee Table and an Address Table, have those related via EmployeeId or something. 最好的方法是打破你的表,这样你有一个员工表和一个地址表,通过EmployeeId或其他东西相关。

Then, you pull the information into two different tables, relate, and nest them accordingly: 然后,将信息拉入两个不同的表,关联,并相应地嵌套它们:

DataSet empList = new DataSet("EmployeeDetails");
DataTable employee = Employees;
DataTable address = Addresses;

empList.Add(employee);
empList.Add(address);

DataRelation relEmpAdd = new DataRelation
(
    "relEmpAdd"
    ,employee.Columns["Id"]
    ,address.Columns["EmployeeId"]
);
relEmpAdd.Nested = true;

ds.Relations.Add(relEmpAdd);

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM