Конвертировать XML в DataTable - PullRequest
10 голосов
/ 03 июня 2011

У меня есть XML-файл, который я хочу вставить в Datatable.Формат XML-файла выглядит следующим образом:

<userid ID="37729">
  <TestId ID="84" TimeRemaining="60" />
  <QuestId ID="1">
    <Answer1>
    </Answer1>
    <Answer2>B</Answer2>
    <Answer3>
    </Answer3>
    <Answer4>
    </Answer4>
  </QuestId>
</userid>

Теперь я хочу вставить это в таблицу данных, как показано ниже:

Question Id     Answer1      Answer2        Answer3        Answer4
1                 A                                         D

2                             B              C     

3                                            C                     

Может ли кто-нибудь помочь мне добиться этого.

Ответы [ 5 ]

14 голосов
/ 03 июня 2011

Я бы сначала создал DataTable с нужными вам столбцами, а затем заполнил его через Linq-to-XML.

Вы можете использовать запрос Select для создания объекта, который представляет каждую строку, а затем использовать стандартный подход для создания DataRow для каждого элемента ...

class Quest
{
    public string Answer1;
    public string Answer2;
    public string Answer3;
    public string Answer4;
}

public static void Main()
{
    var doc = XDocument.Load("filename.xml");

    var rows = doc.Descendants("QuestId").Select(el => new Quest
    {
        Answer1 = el.Element("Answer1").Value,
        Answer2 = el.Element("Answer2").Value,
        Answer3 = el.Element("Answer3").Value,
        Answer4 = el.Element("Answer4").Value,
    });

    // iterate over the rows and add to DataTable ...

}
12 голосов
/ 03 июня 2011
DataSet ds = new DataSet();
ds.ReadXml(fileNamePath);
2 голосов
/ 03 июня 2011

Как читать XML-данные в DataSet с помощью Visual C # .NET содержит некоторые подробности. По сути, вы можете использовать перегруженный метод DataSet ReadXml , чтобы получить данные в DataSet. Ваши XML-данные будут там в первой DataTable.

Существует также метод DataTable.ReadXml .

1 голос
/ 09 мая 2012

Вы можете использовать этот код (рекомендуется)

 MemoryStream objMS = new MemoryStream();
 DataTable oDT = new DataTable();//Your DataTable which you want to convert
 oDT.WriteXml(objMS);
 objMS.Position = 0;
 XPathDocument result = new XPathDocument(objMS);

Это другой способ, но первый, напр. рекомендуется

StringWriter objSW = new StringWriter();
DataTable oDt = new DataTable();//Your DataTable which you want to convert
oDt.WriteXml(objSW);
string result = objSW.ToString();
0 голосов
/ 20 июля 2015

Может быть, это может быть немного более старая статья.но ответы на вышеперечисленные вопросы не помогут мне так, как мне нужно.Тогда я написал небольшой фрагмент для этого.

Это принимает любой XML, имеющий как минимум 3 уровня (как в этом примере):

<XmlData>
    <XmlRow>
        <XmlField1>Data 1</XmlField1>  
        <XmlField2>Data 2</XmlField2>  
        <XmlField3>Data 3</XmlField3>  
        .......
    </XmlRow>
</XmlData>

public static class XmlParser
{
    /// <summary>
    /// Converts XML string to DataTable
    /// </summary>
    /// <param name="Name">DataTable name</param>
    /// <param name="XMLString">XML string</param>
    /// <returns></returns>
    public static DataTable BuildDataTableFromXml(string Name, string XMLString)
    {
        XmlDocument doc = new XmlDocument();
        doc.Load(new StringReader(XMLString));
        DataTable Dt = new DataTable(Name);
        try
        {

            XmlNode NodoEstructura = doc.FirstChild.FirstChild;
            //  Table structure (columns definition) 
            foreach (XmlNode columna in NodoEstructura.ChildNodes)
            {
                Dt.Columns.Add(columna.Name, typeof(String));
            }

            XmlNode Filas = doc.FirstChild;
            //  Data Rows 
            foreach (XmlNode Fila in Filas.ChildNodes)
            {
                List<string> Valores = new List<string>();
                foreach (XmlNode Columna in Fila.ChildNodes)
                {
                    Valores.Add(Columna.InnerText);
                }
                Dt.Rows.Add(Valores.ToArray());
            }
        } catch(Exception)
        {

        }

        return Dt;
    }
}

Это решит мою проблему

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...