2012-10-05 36 views
0

我刚刚才刚刚开始使用XML字符串。我现在在做的是使用web服务从数据库中提取记录。它返回以下输出:从XML字符串到datagridview或数据表的特定元素(C#)

<?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> 

我想要实现的是将显示给用户的datatable/datagridview。这将是这样的:

| 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来创建唯一的列,然后根据所包含的值设置行的值。但我不确定我应该如何去做这件事。谁能帮忙?还是有更好的方式来实现我期待的目标?

我知道如果元素是独一无二的,但我无法以任何方式改变web服务的输出。

任何帮助将不胜感激。

编辑:

我只是意识到我忽略添加XML字符串将包含HTML标记和标记 (具体< P> </P>) (& LT & GT &放大器等)在现场文本。有没有人有任何建议,我可以删除/转义/解码之前写入他们的数据表?

+0

我很惊讶“字​​段”被接受为DataMember名称。 –

+0

你的'ds.Tables.Count'是什么?我认为它是2,你需要从元数据开始选择连接。 –

回答

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++; 

     } 
+0

它很棒!不过,我已经意识到现场文本被包含在html标签(特别是

)中并包含标记(例如&amp;&lt;)等。有关我如何删除它的任何建议? – Winz

+0

你可以使用正则表达式来删除<>。 using System.Text.RegularExpressions; Regex.Replace(“

这是一个数据库记录

”,“<.*?>”,string.Empty) –

相关问题