如何将所有列作为属性导出DataTable到Xml?

Ste*_*ger 8 .net c# xml vb.net datatable

问题:我正在将System.Data.DataTable导出为XML.到目前为止它工作正常.但我希望在属性中包含所有数据,这也可以正常工作.但我现在的问题是,如果在一列中,所有行都是NULL,则不会写入空属性.因此,如果我将XML读回DataTable,它缺少此列...

即使它们是空的,我如何强制写入所有列?
(DataType不一定是字符串)

public void ExportTable(string strDirectory, DataTable dtt)
{
    using (System.Data.DataSet ds = new System.Data.DataSet()) {
        string strTable = dtt.TableName;

        ds.Tables.Add(dtt);
        ds.DataSetName = strTable;

        // Move data to attributes 
        foreach (DataTable dt in ds.Tables) {

            foreach (DataColumn dc in dt.Columns) {
                dc.ColumnMapping = MappingType.Attribute;
            }

        }

        System.Xml.XmlWriterSettings settings = new System.Xml.XmlWriterSettings();
        settings.Indent = true;
        //settings.Encoding = System.Text.Encoding.GetEncoding("ISO-8859-1") 
        settings.Encoding = System.Text.Encoding.UTF8;
        settings.CloseOutput = true;
        settings.CheckCharacters = true;
        settings.NewLineChars = "\r\n";
        // vbCr & vbLf 

        // Write as UTF-8 with indentation 
        using (System.Xml.XmlWriter w = System.Xml.XmlWriter.Create(System.IO.Path.Combine(strDirectory, strTable + ".xml"), settings)) {

            // Strip out timezone 
            foreach (DataTable dt in ds.Tables) {

                foreach (DataColumn dc in dt.Columns) {

                    if (object.ReferenceEquals(dc.DataType, typeof(DateTime))) {
                        dc.DateTimeMode = DataSetDateTime.Unspecified;
                    }

                }

            }

            ds.Tables[0].WriteXml(w, XmlWriteMode.IgnoreSchema);
            w.Flush();
            w.Close();
        }
        // w 

    }
    // ds 

}
// ExportTable 
Run Code Online (Sandbox Code Playgroud)

VB.NET原创:

 Public Sub ExportTable(strDirectory As String, dtt As DataTable)
        Using ds As New System.Data.DataSet()
            Dim strTable As String = dtt.TableName

            ds.Tables.Add(dtt)
            ds.DataSetName = strTable

            ' Move data to attributes
            For Each dt As DataTable In ds.Tables

                For Each dc As DataColumn In dt.Columns
                    dc.ColumnMapping = MappingType.Attribute
                Next dc

            Next dt

            Dim settings As New System.Xml.XmlWriterSettings()
            settings.Indent = True
            'settings.Encoding = System.Text.Encoding.GetEncoding("ISO-8859-1")
            settings.Encoding = System.Text.Encoding.UTF8
            settings.CloseOutput = True
            settings.CheckCharacters = True
            settings.NewLineChars = vbCrLf ' vbCr & vbLf

            ' Write as UTF-8 with indentation
            Using w As System.Xml.XmlWriter = System.Xml.XmlWriter.Create(System.IO.Path.Combine(strDirectory, strTable & ".xml"), settings)

                ' Strip out timezone
                For Each dt As DataTable In ds.Tables

                    For Each dc As DataColumn In dt.Columns

                        If dc.DataType Is GetType(DateTime) Then
                            dc.DateTimeMode = DataSetDateTime.Unspecified
                        End If

                    Next dc

                Next dt

                ds.Tables(0).WriteXml(w, XmlWriteMode.IgnoreSchema)
                w.Flush()
                w.Close()
            End Using ' w

        End Using ' ds

    End Sub ' ExportTable
Run Code Online (Sandbox Code Playgroud)

Jam*_*See 8

必须为每个XML属性分配一个包含在一对单引号或双引号中的值.纯文本中没有等效表示NULL值.没有值表示空字符串的一对引号与NULL值不同.因此,表示NULL属性的唯一方法是省略该属性.

这意味着您需要设置AllowDBNull为false并DefaultValue在DataColumn上分配合适的或包含架构.

另请参阅处理空值(ADO.NET).,特别是这部分解释了行为:

此外,以下规则适用于DataRow的实例.["columnName"] null赋值:

1.除了强类型空列之外,默认默认值为DbNull.Value,其中它是适当的强类型空值.

2.在序列化到XML文件期间永远不会写出空值(如"xsi:nil").

3.在序列化为XML时,始终会写出所有非空值,包括默认值.这与XSD/XML语义不同,其中空值(xsi:nil)是显式的,默认值是隐式的(如果不存在于XML中,则验证解析器可以从关联的XSD架构获取它).对于DataTable则相反:空值是隐式的,默认值是显式的.

4.从XML输入读取的行的所有缺失列值都指定为NULL.使用NewRow或类似方法创建的行将分配DataColumn的默认值.

5. IsNull方法对DbNull.Value和INullable.Null都返回true.