【问题标题】:Xml to a DataSet then Combine DataTables Based on DateXml 到数据集,然后根据日期组合数据表
【发布时间】:2014-07-28 04:45:50
【问题描述】:

我认为另一个人问了一个类似于我想要完成的问题HERE。我正在尝试获取 XML Web 响应并根据其日期在行中使用每个 PayCodeId 和 AmountInTime 构建一个 DataTable。有些日期没有 PayCodeIds 或 AmountInTime,但我仍然需要用一行来表示该日期。以下是 xml 响应的示例:

<DailyTotals>
  <DateTotals Date="5/24/2014"/>
  <DateTotals Date="5/25/2014" GrandTotal="0.0">
    <Totals></Totals>
  </DateTotals>
  <DateTotals Date="5/26/2014" GrandTotal="13.25">
    <Totals>
      <Total PayCodeId="101" AmountInTime="5.25"/>
      <Total PayCodeId="601" AmountInTime="13.25"/>
      <Total PayCodeId="301" AmountInTime="8.0"/>
      <Total PayCodeId="602" AmountInTime="8.0"/>
    </Totals>
  </DateTotals>
  <DateTotals Date="5/27/2014"/>
  <DateTotals Date="5/28/2014" GrandTotal="0.0">
    <Totals></Totals>
  </DateTotals>
  <DateTotals Date="5/29/2014" GrandTotal="8.25">
    <Totals>
      <Total PayCodeId="101" AmountInTime="2.25"/>
      <Total PayCodeId="601" AmountInTime="8.25"/>
      <Total PayCodeId="301" AmountInTime="6.0"/>
      <Total PayCodeId="602" AmountInTime="6.0"/>
    </Totals>
  </DateTotals>
</DailyTotals>

这是我希望我的 DataTable 的外观:

|  Date   | | PayCode | |AmtTime|
 5/24/2014
 5/25/2014
 5/26/2014    101         5.25
 5/26/2014    601         13.25
 5/26/2014    301         8.0
 5/26/2014    602         8.0
 5/27/2014
 5/28/2014
 5/26/2014    101         2.25
 5/26/2014    601         8.25
 5/26/2014    301         6.25
 5/26/2014    602         6.25

我正在从 xml 响应构建一个 DataSet,然后尝试使用这些表,以某种方式迭代或循环它们以完成此操作。我很难弄清楚如何为不同的支付代码创建新行并为其分配适当的日期。这是我迄今为止尝试过的代码 sn-p 不起作用:

    using (XmlReader reader = XmlReader.Create(new StringReader(results)))
        {

            ds.ReadXml(reader);
        }

        // Build DataTable
        dt.Columns.Add("Date");
        dt.Columns.Add("PayCodeId");
        dt.Columns.Add("AmountInTime");

        DataTable dateTotals = ds.Tables["DateTotals"];
        DataTable total = ds.Tables["Total"];

        for (int i = 0; i < dateTotals.Rows.Count; i++)
        {
            DataRow dr;
            object[] rowItems = new object[dt.Columns.Count];

            // Set the Date for each row item
            rowItems[0] = dateTotals.Rows[i].Field<string>("Date");

            if (dateTotals.Rows[i].Field<string>("GrandTotal") == null
                || dateTotals.Rows[i].Field<string>("GrandTotal") == "0.0")
            {
                rowItems[1] = "";
                rowItems[2] = "";
            }
            else
            {
                foreach (DataRow row in total.Rows)
                {
                    rowItems[1] = row.Field<string>("PayCodeId");
                    rowItems[2] = row.Field<string>("AmountInTime");
                }
            }

            dr = dt.NewRow();
            dr.ItemArray = rowItems;
            dt.Rows.Add(dr);

我希望响应中的 xml 格式有所不同,但对此我无能为力。我正在尝试使用 DataSet 及其表来完成吗?在另一个question 中,我正在查看它似乎使用不同的 XmlReadMode 选项可能有一个答案,但它是在 VB 而不是 C# 中。我仍在研究它,如果我弄清楚了,我会发布答案。感谢大家的任何帮助或建议,并帮助我学习:)

【问题讨论】:

    标签: c# xml datatable dataset


    【解决方案1】:

    我提到的链接here 确实有我正在寻找的答案。如果有人需要 C# 中的答案/示例,您可以将其用作参考。这是有效的代码:

        // Create an XmlReader
        using (XmlReader reader = XmlReader.Create(new StringReader(results)))
        {
            ds.ReadXml(reader);
        }
    
        // Build DataTable
        StringBuilder sb = new StringBuilder();
        dt.Columns.Add("Date");
        dt.Columns.Add("PayCodeId");
        dt.Columns.Add("AmountInTime");
    
        DataTable dateTotals = ds.Tables["DateTotals"];
        DataTable totals = ds.Tables["Totals"];
        DataTable total = ds.Tables["Total"];
    
        foreach(DataRow dateTotalsRow in dateTotals.Rows)
        {
            if (dateTotalsRow.Field<string>("GrandTotal") == null || dateTotalsRow.Field<string>("GrandTotal") == "0.0")
            {
                DataRow dr;
                object[] rowItems = new object[dt.Columns.Count];
    
                rowItems[0] = dateTotalsRow.Field<string>("Date");
                rowItems[1] = "";
                rowItems[2] = "";
    
                dr = dt.NewRow();
                dr.ItemArray = rowItems;
                dt.Rows.Add(dr);
            }
            else
            {
                foreach (DataRow totalsRow in totals.Rows)
                {
                    if (totalsRow.Field<int>("DateTotals_Id").ToString() == dateTotalsRow.Field<int>("DateTotals_Id").ToString())
                    {
                        foreach (DataRow totalRow in total.Rows)
                        {
                            if (totalRow.Field<int>("Totals_Id").ToString() == totalsRow.Field<int>("Totals_Id").ToString())
                            {
                                DataRow dr;
                                object[] rowItems = new object[dt.Columns.Count];
    
                                rowItems[0] = dateTotalsRow.Field<string>("Date");
                                rowItems[1] = totalRow.Field<string>("PayCodeId");
                                rowItems[2] = totalRow.Field<string>("AmountInTime");
    
                                dr = dt.NewRow();
                                dr.ItemArray = rowItems;
                                dt.Rows.Add(dr);
                            }
                        }
                    }
                }
            }
        }
    
        return dt;
    

    这里的关键是 ReadXml 自动为表提供参考 ID。我不知道这一点,并从中学到了一些东西。非常感谢 Matt Wilko 几年前用 VB HERE 写的答案,这给了我答案。迟到的谢谢马特!

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-08-22
      • 2021-11-18
      • 1970-01-01
      • 1970-01-01
      • 2016-04-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多