2010-12-06 11 views
2

私は(動的に作成された)DataTableを持っていて、それを(おそらく)非常に異なる構造でXMLに変換したいと思います。ユーザーは、変換が使用する「プロパティ」を表す列を選択します。DataTableをXMLに変換するための、変更を防ぐ最速の方法は?

<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#1の結果の

|Column 1|Column 2| Column 3| 

ください。

質問:どのようにこれをできるだけ速く行うことができ、今後の変更が可能です(読んでください:データテーブルを変換する新しいxml形式を追加してください)?私が必要とするのは、一般的な「デザインパターン」のようなヒントです。

:XMLTransformは関係ありません。

+0

あなたはあなたの例を明確にすることができますか?変換の目標は何ですか?これらのプロパティは何ですか? – cordialgerm

答えて

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

2

DataTable.WriteXmlを試しましたか?

WriteXmlメソッドは、DataTableのデータのみ、またはデータとスキーマの両方をXMLドキュメントに書き込む方法を提供しますが、WriteXmlSchemaメソッドはスキーマのみを書き込みます。データとスキーマの両方を書き込むには、XmlWriteModeパラメーターを含むオーバーロードのいずれかを使用し、その値をWriteSchemaに設定します。

関連する問題