如何使用所有列作为属性将数据表导出到 Xml? [英] How to export a DataTable to Xml with ALL columns as attributes?

查看:18
本文介绍了如何使用所有列作为属性将数据表导出到 Xml?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

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

Question: I'm exporting a System.Data.DataTable to XML. So far it works fine. But I want to have all the data in attributes, which works fine as well. But my problem now, if in one column, all rows are NULL, no empty attributes are written. So if I read the XML back to a DataTable, it lacks this column...

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

How can I force write all columns even when they are empty ?
(DataType not necessarely string)

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 = "
";
        // 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 

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

推荐答案

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

Every XML attribute must be assigned a value that is enclosed in a pair of single or double quotation marks. There is no equivalent in plain text to denote a NULL value. A pair of quotation marks with no value to represent an empty string is not the same as a NULL value. Therefore, the only way to represent a NULL attribute is to omit the attribute.

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

This means that you will need to either set AllowDBNull to false and assign a suitable DefaultValue on the DataColumn, or include the schema.

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

Also, see Handling Null Values (ADO.NET)., particularly this section which explains the behavior:

此外,以下规则适用于DataRow.["columnName"] 空赋值:

In addition, the following rules apply for an instance of DataRow.["columnName"] null assignments:

1.默认默认值是 DbNull.Value 对于除强类型空列之外的所有列,它是适当的强类型空值.

1.The default default value is DbNull.Value for all except the strongly typed null columns where it is the appropriate strongly typed null value.

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

2.Null values are never written out during serialization to XML files (as in "xsi:nil").

3.所有非空值,包括默认值,在序列化为 XML 时总是被写出.这与 XSD/XML 语义不同,在 XSD/XML 语义中null 值 (xsi:nil) 是显式的,默认值是隐式的(如果XML 中不存在,验证解析器可以从关联的XSD 架构).DataTable 的情况正好相反:空值是隐式,默认值为显式.

3.All non-null values, including defaults, are always written out while serializing to XML. This is unlike XSD/XML semantics where a null value (xsi:nil) is explicit and the default value is implicit (if not present in XML, a validating parser can get it from an associated XSD schema). The opposite is true for a DataTable: a null value is implicit and the default value is explicit.

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

4.All missing column values for rows read from XML input are assigned NULL. Rows created using NewRow or similar methods are assigned the DataColumn's default value.

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

5.The IsNull method returns true for both DbNull.Value and INullable.Null.

这篇关于如何使用所有列作为属性将数据表导出到 Xml?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆