Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/asp.net/31.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Asp.net XML到数据表的转换失败_Asp.net_Xml_Datatable - Fatal编程技术网

Asp.net XML到数据表的转换失败

Asp.net XML到数据表的转换失败,asp.net,xml,datatable,Asp.net,Xml,Datatable,我想将XML字符串转换为Datatable <TextstringArray> <values> <value>athul</value> <value>aks@phases.dk</value> <value>1</value> </values> <values> <value&g

我想将XML字符串转换为Datatable

<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);
但是数据集的数据格式错误。 就像所有的值元素都在一列中一样。我希望它们在三列中。一列为第一列,以此类推。(Xml进入表中,但不是Xml结构)


您可以使用一些灵巧的方法将数据分组并投影到新的数据结构中

注意,下面的代码期望每个组中正好有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);
}

为了实现您的目标,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>

数据以何种方式被错误格式化?(你得到了什么?你期望得到什么?)你的格式有什么问题?你注意到数据集中实际上有两个数据表吗?@Richard所有元素都是相同的column@AlexFilipovici:是的,实际上这也是一个问题。一列中的值元素和另一列中的值我不可能改变xml的出现方式,它来自一个外部api。还有其他方法吗?@Arun我在回答中发布了一个选项。请注意,这将是脆弱的,无法很好地处理XML格式的更改。然而,任何提议的解决方案都会有这个问题。@RB。。。任何提议的解决方案都会有这个问题。不太可能,只要您不对
值的数量或顺序进行任何假设。在序列化过程中,除非在类表示上使用属性来控制它,否则无法保证处理顺序。@AlexFilipovici如果不假设
子项的数量或顺序,您将不知道每个子项代表什么数据,因此将留下任意一系列字符串。是的,但是任意部分是因为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>
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