C# 从XML字符串到datagridview或datatable(C)的特定元素

C# 从XML字符串到datagridview或datatable(C)的特定元素,c#,xml,linq,datagridview,datatable,C#,Xml,Linq,Datagridview,Datatable,我最近才开始使用XML字符串。我现在做的是使用Web服务从数据库中提取记录。它返回以下输出: <?xml version="1.0" encoding="utf-16"?> <Records count="2"> <Metadata> <FieldDefinitions> <FieldDefinition id="13597" name="Statement" alias="Statement" /

我最近才开始使用XML字符串。我现在做的是使用Web服务从数据库中提取记录。它返回以下输出:

<?xml version="1.0" encoding="utf-16"?>
<Records count="2">
    <Metadata>
        <FieldDefinitions>
          <FieldDefinition id="13597" name="Statement" alias="Statement" />
          <FieldDefinition id="13598" name="Response" alias="Response" />
        </FieldDefinitions>
    </Metadata>
    <Record contentId="154321" moduleId="409">
        <Field id="13597" type="1">&lt;p&gt;This is a database record&lt;/p&gt;</Field>
        <Field id="13598" type="1">&lt;p&gt;This is a record&lt;/p&gt;</Field>
    </Record>
    <Record contentId="154755" moduleId="409">
        <Field id="13597" type="1">&lt;p&gt;This is another database record&lt;/p&gt;</Field>
        <Field id="13598" type="1">&lt;p&gt;And another corresponding record&lt;/p&gt;</Field>
    </Record>
</Records>
我尝试了以下代码:

    private void WriteDataGrid(string xml)
    {
        DataSet ds = new DataSet();
        XmlTextReader reader = new XmlTextReader(xml, XmlNodeType.Document, null);
        ds.ReadXml(reader);
        dataGridView1.DataSource = ds;
        dataGridView1.DataMember = "Field";
    }
然而,它仅设法获得以下信息:

|    id | type  | Field_Text       |
|13597  | 1     | This is a...     |
|13598  | 1     | This is a corr...|
|13597  | 1     | This is anoth... |
|13598  | 1     | And anothe...    |
我计划使用xml中的字段id创建唯一的列,然后根据封闭的值设置行的值。但我不确定该怎么做。有人能帮忙吗?还是有更好的方法让我实现自己的目标

我知道如果元素是唯一的,那就容易多了,但是我无法以任何方式改变webservices的输出

任何帮助都将不胜感激

编辑:

我刚刚意识到我忽略了添加XML字符串将包含HTML标记和标记 特别是


&字段文本中的lt>&等。在将它们写入数据表之前,有人对我如何删除/转义/解码它们有什么建议吗

//XMLFile.xml文件包含服务的xml响应。最后的输出是dt1,它包含您想要的格式的数据

 DataSet ds = new DataSet();
        DataTable dt = new DataTable();
        ds.ReadXml(Server.MapPath("~/XMLFile.xml"));
        dt = ds.Tables[5];

        var query = from s in dt.AsEnumerable()
                    group s by s.Field<string>("id") into g
                    select new { id = g.Key, field_text = g.ToList(),Count=g.ToList().Count };


        DataTable dt1 = new DataTable();
        int maxRowid=0;
        foreach (var obj in query)
        {
            dt1.Columns.Add(obj.id);
            if(obj.Count>maxRowid)
            {
                maxRowid=obj.Count;
            }

        }

        // Add Rows to table         
        for (int count = 0; count < maxRowid; count++)
        {
            dt1.Rows.Add("", "");
        }

        int i = 0;
        foreach (var obj in query)
        {
            int j = 0;
            foreach (var dr in obj.field_text)
            {
                dt1.Rows[j][i] = ((DataRow)dr)["field_text"];
                j++;
            }
            i++;

        }

//xml文件包含服务的xml响应。最后的输出是dt1,它包含您想要的格式的数据

 DataSet ds = new DataSet();
        DataTable dt = new DataTable();
        ds.ReadXml(Server.MapPath("~/XMLFile.xml"));
        dt = ds.Tables[5];

        var query = from s in dt.AsEnumerable()
                    group s by s.Field<string>("id") into g
                    select new { id = g.Key, field_text = g.ToList(),Count=g.ToList().Count };


        DataTable dt1 = new DataTable();
        int maxRowid=0;
        foreach (var obj in query)
        {
            dt1.Columns.Add(obj.id);
            if(obj.Count>maxRowid)
            {
                maxRowid=obj.Count;
            }

        }

        // Add Rows to table         
        for (int count = 0; count < maxRowid; count++)
        {
            dt1.Rows.Add("", "");
        }

        int i = 0;
        foreach (var obj in query)
        {
            int j = 0;
            foreach (var dr in obj.field_text)
            {
                dt1.Rows[j][i] = ((DataRow)dr)["field_text"];
                j++;
            }
            i++;

        }

我很惊讶该字段被接受为DataMember名称。您的ds.Tables.Count是多少?我认为是2,您需要从元数据开始选择联接。我很惊讶该字段被接受为DataMember名称。您的ds.Tables.Count是多少?我认为它是2,你需要从元数据开始选择连接。它工作得很好!但是,我已经意识到字段文本会被具体地包含在html标记中,并包含标记,例如&,<等等。。关于如何删除此项的任何建议?您可以使用正则表达式来删除。使用System.Text.RegularExpressions;Regex.Replace这是一条数据库记录

,string.Emptyit工作得很好!但是,我已经意识到字段文本会被具体地包含在html标记中,并包含标记,例如&,<等等。。关于如何删除此项的任何建议?您可以使用正则表达式来删除。使用System.Text.RegularExpressions;Regex.Replace这是一条数据库记录,string.Empty