0

XML文字列をDatatableに変換したい.Stringはこんな感じ

<TextstringArray>
    <values>
        <value>athul</value>
        <value>aks@phases.dk</value>
        <value>1</value>
    </values>
    <values>
        <value>arun</value>
        <value>am@phases.dk</value>
        <value>1</value>
    </values>
    <values>
        <value>ajmal</value>
        <value>am@phases.dk</value>
        <value>1</value>
    </values>
</TextstringArray>

私はこのようなことを試しました

StringReader theReader = new StringReader(invitations);
DataSet theDataSet = new DataSet();
theDataSet.ReadXml(theReader);

しかし、データセットには間違った形式のデータが含まれています。すべての値要素が単一の列に入っているように.私はそれらを3つの列に入れたい.最初に1つなど.(XMLはテーブルに入っていますが、xml構造には入っていません)

ここに画像の説明を入力

4

2 に答える 2

1

目標を達成するために、XML は次の構造を持つ必要があります。

<TextstringArray>
    <values>
        <value1>athul</value1>
        <value2>aks@phases.dk</value2>
        <value3>1</value3>
    </values>
    <values>
        <value1>arun</value1>
        <value2>am@phases.dk</value2>
        <value3>1</value3>
    </values>
    <values>
        <value1>ajmal</value1>
        <value2>am@phases.dk</value2>
        <value3>1</value3>
    </values>
</TextstringArray>

これにより、1 つのデータテーブルが生成されます。各values要素はデータ行のソースになり、その各子要素 (value1などvalue2) は列として読み取られます。

回避策は次のとおりです。

StringReader theReader = new StringReader(File.ReadAllText(invitations));
DataSet theDataSet = new DataSet();
theDataSet.ReadXml(theReader);

var valueIdsDatatable = theDataSet.Tables[0];
var valueDatatable = theDataSet.Tables[1];

// detect the maximum number of columns
var maxColumns = valueDatatable.AsEnumerable()
    .GroupBy(i => i["values_Id"]).Max(i => i.Count());

// create the result DataTable
var resultDataTable = new DataTable();

// add dynamically the columns
for (int i = 0; i < maxColumns; i++)
{
    resultDataTable.Columns.Add("property" + i);
}

// add the rows
foreach (DataRow valueId in valueIdsDatatable.Rows)
{
    var newRow = resultDataTable.NewRow();
    var currentRows = valueDatatable.Select("values_id = " + valueId[0]);
    for (int i = 0; i < currentRows.Length; i++)
    {
        newRow[i] = currentRows[i][0];
    }
    resultDataTable.Rows.Add(newRow);
}

// TODO: use the resultDataTable
于 2013-03-07T10:26:36.600 に答える
0

LINQy の利点を利用して、新しいデータ構造にグループ化および射影することができます。

次のコードは、すべてのグループに正確に 3 つの値があることを想定しており、入力が一貫していることに依存していることに注意してください。そうでない場合は、環境に合わせて調整する必要があります。

StringReader theReader = new StringReader(invitations);
DataSet theDataSet = new DataSet();
theDataSet.ReadXml(theReader);

// Get the table we are interested in.
var dt = theDataSet.Tables["value"];

// Group by the "values_Id" field. This is what logically 
// relates each <value>.
// Then, project out a new type, assuming that the first row 
// holds the username, the second holds the email address,
// and the third holds "some thing else".
var rows = dt.Rows.
    Cast<DataRow>().
    GroupBy(dr => dr["values_Id"]).
    Select(row => 
        new 
        {
            RowId = row.Key,
            UserName = row.ElementAt(0)["value_Text"],
            UserEmail = row.ElementAt(1)["value_Text"],
            UserOtherValue = row.ElementAt(2)["value_Text"]
        });

foreach (var row in rows)
{
    Console.WriteLine("Row " + row.RowId);
    Console.WriteLine("    UserName: " + row.UserName);
    Console.WriteLine("    Email: " + row.UserEmail);
    Console.WriteLine("    OtherValue: " + row.UserOtherValue);
}

次の出力が生成されます。

Row 0
    UserName: athul
    Email: aks@phases.dk
    OtherValue: 1
Row 1
    UserName: arun
    Email: am@phases.dk
    OtherValue: 1
Row 2
    UserName: ajmal
    Email: am@phases.dk
    OtherValue: 1
于 2013-03-07T10:18:20.543 に答える