.net - XML 中包含空值的类型化数据集

标签 .net xml xml-serialization dataset

当使用 ds.GetXml 将类型化 DataSet 写入 XML 时,具有空值的列将从 XML 中删除。我知道这是因为架构没有写入等,但是有没有办法覆盖它,而不必在写入 XML 之前解析数据集并将所有数据库空值转换为空字符串?


编辑:附加信息:

1)我的主要任务是获取数据集并将其流式传输到 WebRequest。所以我正在创建一个 XML 文档

Dim xmldoc As New Xml.XmlDocument()
xmldoc.LoadXml(dsUpload.GetXml)

然后像这样在 HTTpWebRequest(req) 上上传 xmldoc

Using xw As XmlTextWriter = 
  New XmlTextWriter(req.GetRequestStream, System.Text.Encoding.Default)
    xw.Formatting = Formatting.Indented
    xmldoc.WriteTo(xw)
    xw.Close()
End Using

2)我说的是DBNull

3)我需要显示这些列,因为我上传到的网站需要包含所有标签,以便他们可以解析它(必须是旧系统)


编辑

1)我同意代码效率不高,但我没有提到的是上传方法是另一个类中的通用方法。因此它接受 XMLDoc,因为同样的方法可以将数据集上传为 xml 和硬编码的 XML 字符串

2)是的,同意只有 System.String 可以转换为 String.Empty。这就是我的数据集的主要内容。

3)关于遗留系统评论的哈哈。这里有更荒谬的东西。我认为他们可能会像解析逗号分隔的文件一样解析 XML。只要数据中存在逗号,它就会将其丢弃! :)

最佳答案

首先,我建议您永远不要将 XML 作为字符串处理。您应该始终使用对 XML 规则敏感的 API。在这种情况下,您应该使用 DataSet.WriteXml 的重载之一。

其次,当你说“null”时,你指的是DBNull吗?也就是说,数据库术语中的 NULL,或者您指的是 C# 中的值 null 和 VB.NET 中的 Nothing 值?

最后,为什么要显示这些列?它们只是占用空间。


编辑:

  1. 代码更正:此代码效率低下:将 DataSet 保存到 XML 字符串,然后再次解析 XML 以加载到 XmlDocument 中,然后最后再次将 XML 写入请求流。它还使用 XmlTextWriter,该方法从 .NET 2.0 开始已弃用。以下内容更加清晰:

    Dim settings As New XmlWriterSettings With {.Indent = True}
    Using stream = req.GetRequestStream
        Using writer = XmlWriter.Create(stream, settings)
            dsUpload.WriteXml(writer, XmlWriteMode.IgnoreSchema)
        End Using
    End Using
    
  2. 根据研究,似乎没有一种简单的方法可以强制显示列。您可以将所有 DBNull.Value 值替换为其类型的默认值(注意 String.Empty 仅当列的 .NET 类型为 string。例如,它不适用于 DateTime 列)。一旦设置为 DBNull.Value 以外的值,我认为您将必须遍历表中的所有列,并将其 AllowDBNull 属性设置为

真正需要发生的是您要上传到的网站需要学习 XML。在当今时代,软件不能很好地理解 XML,无法提供 XML 架构以便它们了解需要哪些列,这是可耻的。

如果您愿意说出这是哪个网站,我相信我们都会很乐意公开 mock 他们。

:-)

关于.net - XML 中包含空值的类型化数据集,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1196058/

相关文章:

.net - 使用 DateTime.ParseExact 仅获取时间(不包含日期)

c# - 自定义数据的 XML 序列化

c# - 将对象序列化为具有属性和子元素的元素

java - 如何处理 SOAP 调用中的方法及其参数

android - Eclipse 声称我缺少 </application> 标记;不知道出了什么问题

java - “HTML 属性不可序列化”异常 (java)

c# - 如何使用 PCL 创建目录

c# - ToUniversalTime() 和 ToLocalTime() 之间的区别

.net - 在 VS 2017 RC 中创建 .NET 标准类库时,我应该如何将包引用保留为私有(private)实现细节?

xml - SVG 缩放文本以适合容器