我刚刚开始使用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"><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>
我想要实现的是将向用户显示的数据表/数据网格视图。这将是这样的:
| Statement | Response |
|This is a datab..| This is a corr.|
|This is another..| And another....|
我尝试过以下代码:
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创建唯一列,然后根据所包含的值设置行的值。但我不确定我应该怎么做。有人可以帮忙吗?或者,有没有更好的方法来实现我的目标?
我知道如果Elements是唯一的,那会更容易,但我无法以任何方式改变webservices的输出。
非常感谢任何帮助。
修改
我刚刚意识到我忽略了添加XML字符串将包含HTML标记和标记
(特别是&lt; p&gt;&lt; / p&gt; )
(&amp; lt&amp; gt&amp; amp
答案 0 :(得分:3)
// 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++;
}