C# 从XML字符串到datagridview或datatable(C)的特定元素
我最近才开始使用XML字符串。我现在做的是使用Web服务从数据库中提取记录。它返回以下输出: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 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"><p>This is a database record</p></Field>
<Field id="13598" type="1"><p>This is a record</p></Field>
</Record>
<Record contentId="154755" moduleId="409">
<Field id="13597" type="1"><p>This is another database record</p></Field>
<Field id="13598" type="1"><p>And another corresponding record</p></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