0

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>

私が達成しようとしているのは、ユーザーに表示される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を使用して一意の列を作成し、囲まれた値に基づいて行の値を設定する予定です。しかし、私はこれをどのように行えばよいのかわかりません。誰か助けてもらえますか?それとも、私がやろうとしていることを達成するためのより良い方法はありますか?

Elementsが一意であるとはるかに簡単になることは承知していますが、Webサービスの出力を変更することはできません。

どんな助けでも大歓迎です。

編集:

XML文字列にHTMLタグとマークアップ(具体的には<p> </ p>)(&lt&gt&ampなど)がフィールドテキストに含まれることを追加し忘れたことに気づきました。データテーブルに書き込む前に、これらを削除/エスケープ/デコードする方法について誰かが提案を持っていますか?

4

1 に答える 1

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

        }
于 2012-10-05T10:23:37.763 に答える