Устойчивый к изменениям и самый быстрый способ преобразования DataTable в XML? - PullRequest
2 голосов
/ 06 декабря 2010

У меня есть (динамически создаваемый) объект 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)? Q, что мне нужно, это всего лишь несколько советов, как общий «шаблон проектирования».

Пожалуйста, : XMLTransform не задействован.

Ответы [ 2 ]

2 голосов
/ 06 декабря 2010

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

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

1 голос
/ 06 декабря 2010

Вы можете использовать класс 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>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...