2010-12-06 2 views
2

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

: не участвует XMLTransform.

+0

вы можете уточнить ваш пример? Какова цель трансформации? Что это за свойства? – cordialgerm 2010-12-06 02:16:36

ответ

1

Вы можете использовать класс 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> 
+0

Прежде чем `xmlWriter.WriteElementString` вы должны добавить` if (dataColumn.ColumnMapping == MappingType.Element) `(то есть, если ваш dataTable имеет нечто вроде` dataSet.Tables [0] ` – Nux 2011-09-15 09:35:38

2

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

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