2010-12-06 5 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 방식 추가)? 필요한 QH는 일반적인 "디자인 패턴"과 같은 몇 가지 팁입니다.

: 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로 설정합니다.

관련 문제