使用c#将xml字符串转换为datatable

时间:2014-11-28 03:47:14

标签: c#-4.0 c#-3.0

我需要将以下xml字符串转换为datatable。请建议我做任何解决方案

XMLString:

 0
 <Seat-Map> 
  <Lower-Deck>
    <column id="1"> 
        <row id="1"><seat number="1C" status="0" /> </row> 
        <row id="2"><seat number="2C" status="0" /> </row> 
        <row id="3"><seat number="3C" status="0" /> </row> 
        <row id="4"><seat number="4C" status="0" /> </row> 
        <row id="5"><seat number="5C" status="0" /> </row> 
        <row id="6"><seat number="6C" status="0" /> </row> 
        <row id="7"><seat number="7C" status="0" /> </row> 
        <row id="8"><seat number="8C" status="0" /> </row> 
        <row id="9"><seat number="9C" status="0" /> </row> 
        <row id="10"><seat number="10C" status="0" /> </row> 
    </column>
    <column id="2"> 
        <row id="1"><seat number="1B" status="0" /> </row> 
        <row id="2"><seat number="2B" status="0" /> </row> 
        <row id="3"><seat number="3B" status="0" /> </row> 
        <row id="4"><seat number="4B" status="0" /> </row> 
        <row id="5"><seat number="5B" status="0" /> </row> 
        <row id="6"><seat number="6B" status="0" /> </row> 
        <row id="7"><seat number="7B" status="0" /> </row> 
        <row id="8"><seat number="8B" status="0" /> </row> 
        <row id="9"><seat number="9B" status="0" /> </row> 
        <row id="10"><seat number="10B" status="0" /> </row> 
    </column>
    <column id="3"> 
        <row id="1"><seat number="#" status="blank"/> </row> 
        <row id="2"><seat number="#" status="blank"/> </row> 
        <row id="3"><seat number="#" status="blank"/> </row> 
        <row id="4"><seat number="#" status="blank"/> </row> 
        <row id="5"><seat number="#" status="blank"/> </row> 
        <row id="6"><seat number="#" status="blank"/> </row> 
        <row id="7"><seat number="#" status="blank"/> </row> 
        <row id="8"><seat number="#" status="blank"/> </row> 
        <row id="9"><seat number="#" status="blank"/> </row> 
        <row id="10"><seat number="#" status="blank"/> </row> 
    </column>
    <column id="4"> 
        <row id="1"><seat number="1A" status="0" /> </row> 
        <row id="2"><seat number="2A" status="0" /> </row> 
        <row id="3"><seat number="3A" status="0" /> </row> 
        <row id="4"><seat number="4A" status="0" /> </row> 
        <row id="5"><seat number="5A" status="0" /> </row> 
        <row id="6"><seat number="6A" status="0" /> </row> 
        <row id="7"><seat number="7A" status="0" /> </row> 
        <row id="8"><seat number="8A" status="0" /> </row> 
        <row id="9"><seat number="9A" status="0" /> </row> 
        <row id="10"><seat number="10A" status="0" /> </row> 
    </column> 
  </Lower-Deck>
</Seat-Map>

我正在使用以下代码:

StringReader stringReader = new StringReader( Here I am passing xml string);
ds.ReadXml(stringReader);
DataTable dt = ds.Tables[0];

输出我

errorCode             |         xml
-------------------------------------------------------------------------------------------
0                     |  <Seat-Map><Lower-Deck><column id="1"><row id="1">..............
                      |  ....................</Lower-Deck></Seat-Map>

但我需要从XML字符串中跟踪DataTable:

public static DataTable querySeat(string bus_id)
    {
        DataTable dt = new DataTable();
        DataColumn dc;
        dc = new DataColumn("column", Type.GetType("System.Int32"));
        dt.Columns.Add(dc);
        dc = new DataColumn("row", Type.GetType("System.Int32"));
        dt.Columns.Add(dc);
        dt.Columns.Add("seat"); // Seat Label
        dc = new DataColumn("deck", Type.GetType("System.Int32")); // Deck, 1 = Lower Deck, 2 = Upper Deck
        dt.Columns.Add(dc);
        dt.Columns.Add("status"); // Status, 1 = Available, 0 = Taken
        return dt;
    } 

1 个答案:

答案 0 :(得分:0)

好吧,我希望这会有所帮助。我完成它的方法是解析Xml并将其加载到DOM(这里我使用LinqToXml),然后尝试查找所有席位并将它们插入到DataTable的实例中。

using System;
using System.Data;
using System.Linq;
using System.Xml.Linq;

namespace ConsoleApplication2
{
    class Program
    {
        static void Main(string[] args)
        {
            string XmlData = @"<Seat-Map>
  <Lower-Deck>
    <column id=""1""> 
        <row id=""1""><seat number=""1C"" status=""0"" /> </row> 
        <row id=""2""><seat number=""2C"" status=""0"" /> </row> 
        <row id=""3""><seat number=""3C"" status=""0"" /> </row> 
        <row id=""4""><seat number=""4C"" status=""0"" /> </row> 
        <row id=""5""><seat number=""5C"" status=""0"" /> </row> 
        <row id=""6""><seat number=""6C"" status=""0"" /> </row> 
        <row id=""7""><seat number=""7C"" status=""0"" /> </row> 
        <row id=""8""><seat number=""8C"" status=""0"" /> </row> 
        <row id=""9""><seat number=""9C"" status=""0"" /> </row> 
        <row id=""10""><seat number=""10C"" status=""0"" /> </row> 
    </column>
    <column id=""2""> 
        <row id=""1""><seat number=""1B"" status=""0"" /> </row> 
        <row id=""2""><seat number=""2B"" status=""0"" /> </row> 
        <row id=""3""><seat number=""3B"" status=""0"" /> </row> 
        <row id=""4""><seat number=""4B"" status=""0"" /> </row> 
        <row id=""5""><seat number=""5B"" status=""0"" /> </row> 
        <row id=""6""><seat number=""6B"" status=""0"" /> </row> 
        <row id=""7""><seat number=""7B"" status=""0"" /> </row> 
        <row id=""8""><seat number=""8B"" status=""0"" /> </row> 
        <row id=""9""><seat number=""9B"" status=""0"" /> </row> 
        <row id=""10""><seat number=""10B"" status=""0"" /> </row> 
    </column>
    <column id=""3""> 
        <row id=""1""><seat number=""#"" status=""blank""/> </row> 
        <row id=""2""><seat number=""#"" status=""blank""/> </row> 
        <row id=""3""><seat number=""#"" status=""blank""/> </row> 
        <row id=""4""><seat number=""#"" status=""blank""/> </row> 
        <row id=""5""><seat number=""#"" status=""blank""/> </row> 
        <row id=""6""><seat number=""#"" status=""blank""/> </row> 
        <row id=""7""><seat number=""#"" status=""blank""/> </row> 
        <row id=""8""><seat number=""#"" status=""blank""/> </row> 
        <row id=""9""><seat number=""#"" status=""blank""/> </row> 
        <row id=""10""><seat number=""#"" status=""blank""/> </row> 
    </column>
    <column id=""4""> 
        <row id=""1""><seat number=""1A"" status=""0"" /> </row> 
        <row id=""2""><seat number=""2A"" status=""0"" /> </row> 
        <row id=""3""><seat number=""3A"" status=""0"" /> </row> 
        <row id=""4""><seat number=""4A"" status=""0"" /> </row> 
        <row id=""5""><seat number=""5A"" status=""0"" /> </row> 
        <row id=""6""><seat number=""6A"" status=""0"" /> </row> 
        <row id=""7""><seat number=""7A"" status=""0"" /> </row> 
        <row id=""8""><seat number=""8A"" status=""0"" /> </row> 
        <row id=""9""><seat number=""9A"" status=""0"" /> </row> 
        <row id=""10""><seat number=""10A"" status=""0"" /> </row> 
    </column> 
  </Lower-Deck>
</Seat-Map>"
;

            DataTable result = new DataTable("SeatData");

            DataColumn columnColumn = result.Columns.Add("column", typeof(Int32));

            DataColumn rowColumn = result.Columns.Add("row", typeof(Int32));

            DataColumn seatColumn = result.Columns.Add("seat", typeof(String));

            DataColumn deckColumn = result.Columns.Add("deck", typeof(Int32));

            DataColumn statusColumn = result.Columns.Add("status", typeof(Int32));

            XElement.Parse(
                XmlData
            )
            .Descendants("seat")
            .ToList()
            .ForEach(
                (element) =>
                {
                    DataRow row = result.NewRow();

                    row.SetField<int>(columnColumn, Convert.ToInt32(element.Parent.Parent.Attribute("id").Value));

                    row.SetField<int>(rowColumn, Convert.ToInt32(element.Parent.Attribute("id").Value));

                    row.SetField<string>(seatColumn, element.Attribute("number").Value);

                    int deckNo = -1;

                    if (element.Parent.Parent.Parent.Name.LocalName == "Lower-Deck")

                        deckNo = 1;

                    row.SetField<int>(deckColumn, deckNo);

                    string statusString = element.Attribute("status").Value;
                    int statusValue = -1;

                    if (statusString == "blank")

                        statusValue = 1;

                    else if (statusString == "0")

                        statusValue = 0;

                    row.SetField<int>(statusColumn, statusValue);

                    result.Rows.Add(row);
                }
            );


            result.AsEnumerable()
            .ToList()
            .ForEach(
                (row) =>
                Console.WriteLine(string.Join(",", row.ItemArray))
            );
        }
    }
}

结果如下:

enter image description here

需要考虑的一些事项:

  
      
  1. 您在Xml数据中提供的数据与上述定义不匹配。所以你可能想要更新这个问题。
  2.   
  3. 我宁愿将座位号,状态,行和牌组ID作为座位对象(元素)的外键。
  4.   
  5. 如果您想使用它,请注意代码上方的using语句。
  6.