【问题标题】:Change-proof and fastest way to transform a DataTable to XML?将 DataTable 转换为 XML 的防更改且最快的方法?
【发布时间】:2011-05-20 17:37:21
【问题描述】:

我有一个(动态创建的)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。

【问题讨论】:

  • 你能澄清你的例子吗?转型的目标是什么?这些属性是什么?

标签: c# xml design-patterns datatable transform


【解决方案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>

【讨论】:

  • xmlWriter.WriteElementString 之前的一件事你应该添加 if (dataColumn.ColumnMapping == MappingType.Element) (也就是说,如果你的 dataTable 来自 dataSet.Tables[0] 之类的东西
【解决方案2】:

你试过DataTable.WriteXml吗??

WriteXml 方法提供了一种仅将数据写入 XML 文档的方法,或者将 DataTable 中的数据和模式都写入 XML 文档,而 WriteXmlSchema 方法只写入模式。要同时写入数据和架构,请使用包含 XmlWriteMode 参数的重载之一,并将其​​值设置为 WriteSchema。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-01-28
    • 1970-01-01
    • 2015-04-14
    • 2017-10-07
    • 2010-12-21
    • 2012-01-10
    • 2019-06-23
    相关资源
    最近更新 更多