Надежный и быстрый способ преобразования DataTable в XML?

У меня есть (динамически созданный) DataTable, и я хотел бы преобразовать его в XML с (возможно) совершенно другой структурой. Пользователь будет выбирать, какой столбец представляет «свойства», которые будет использовать преобразование. Например

|Column 1|Column 2| Column 3|

Результирующий XML#1:

<root>
  <node id="Column 1">
  <anothernode id="Column1" target="Column2">
    <data>Column 3</sata>
  </anothernode>
</root>

Или даже эта структура:

<root>
  <nodes>
    <node label="Column 1">
      <data>Column 3</data>
  </nodes>
</root>

И так далее.

Вопрос: как сделать это максимально быстро, допуская будущие изменения (читай: добавить новый xml-способ преобразования таблицы данных)? Что мне нужно, так это несколько советов, вроде общего «шаблона проектирования».

Пожалуйста: не используйте XMLTransform.


person gremo    schedule 06.12.2010    source источник
comment
можете пояснить свой пример? Какова цель трансформации? Каковы эти свойства?   -  person cordialgerm    schedule 06.12.2010


Ответы (2)


Вы можете использовать класс XmlWriter для создания xml в соответствии с желаемой структурой. Вы можете дополнительно оптимизировать код, если заранее знаете, какие столбцы будут содержаться в таблице данных.

private void WriteDataTableToXml(DataTable dataTable, string xmlFilePath)
{   
    XmlWriterSettings settings = new XmlWriterSettings();
    settings.Indent = true;
    settings.IndentChars = "  ";
    settings.NewLineOnAttributes = true;

    using (StreamWriter streamWriter = new StreamWriter(xmlFilePath, false, Encoding.GetEncoding("ISO-8859-1")))
    {
        using (XmlWriter xmlWriter = XmlWriter.Create(streamWriter, settings))
        {
            xmlWriter.WriteStartElement("root");
            xmlWriter.WriteStartElement("nodes");

            foreach (DataRow dataRow in dataTable.Rows)
            {
                xmlWriter.WriteStartElement("node");

                foreach (DataColumn dataColumn in dataTable.Columns)
                {
                    xmlWriter.WriteElementString(dataColumn.ColumnName, dataRow[dataColumn].ToString());
                }

                xmlWriter.WriteEndElement();
            }

            xmlWriter.WriteEndElement();
            xmlWriter.WriteEndElement();
        }
    }
}

Вызов этого метода будет таким:

string xmlFilePath = @"D:\test.xml";

DataTable dataTable = new DataTable();
dataTable.Columns.Add("Col1");
dataTable.Columns.Add("Col2");
dataTable.Columns.Add("Col3");

dataTable.Rows.Add(1, "abc", "zyx");
dataTable.Rows.Add(2, "cde", "mno");
dataTable.Rows.Add(3, "def", "fru");

WriteDataTableToXml(dataTable, xmlFilePath);

И созданный xml будет следующим:

<?xml version="1.0" encoding="iso-8859-1"?>
<root>
  <nodes>
    <node>
      <Col1>1</Col1>
      <Col2>abc</Col2>
      <Col3>zyx</Col3>
    </node>
    <node>
      <Col1>2</Col1>
      <Col2>cde</Col2>
      <Col3>mno</Col3>
    </node>
    <node>
      <Col1>3</Col1>
      <Col2>def</Col2>
      <Col3>fru</Col3>
    </node>
  </nodes>
</root>
person Devendra D. Chavan    schedule 06.12.2010
comment
Одна вещь перед xmlWriter.WriteElementString вы должны добавить if (dataColumn.ColumnMapping == MappingType.Element) (то есть, если ваша таблица данных исходит из чего-то вроде dataSet.Tables[0] - person Nux; 15.09.2011

Вы пробовали DataTable.WriteXml??

Метод WriteXml позволяет записывать либо только данные, либо данные и схему из DataTable в XML-документ, тогда как метод WriteXmlSchema записывает только схему. Чтобы записать и данные, и схему, используйте одну из перегрузок, включающую параметр XmlWriteMode, и задайте для него значение WriteSchema.

person marc_s    schedule 06.12.2010