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)
必须为每个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.