将XML从XDocument插入带有标题的数据库列,没有可见的换行符

时间:2017-05-09 14:32:02

标签: c# sql-server xml

我正在重写一个旧的应用程序,用于使用旧的.aspx表单上传XML文件。我们正在摆脱这种形式,并希望自动化这一过程。在我这样做的过程中,我发现XML格式存在差异,并且希望确保我以与旧应用程序相同的方式处理XML,因为另一个进程依赖于格式。

VB中的旧格式,使用MemoryStream,读取所有字节并返回Stream并创建一个大的内联SQL插入语句,以将数据加载到数据库中。

新格式使用C#和XDocument。这条线

XDocument.Load(fileName)

以正确的格式返回XML,但我没有看到XML标题,数据被花括号括起来 - > " {}"在Visual Studio的XML查看器中,数据看起来很好,所以这可能只是Visual Studio的残留物?

在任何情况下,我都需要在插入数据库时​​让XML包含标头。任何意见,将不胜感激!谢谢!

1 个答案:

答案 0 :(得分:0)

您不应该将XML视为带有一些花哨附加功能的文本 ...它是如何存储在SQL Server中的?如果目标列是真实XML类型,则根本不应该对视觉格式感到烦恼。如果视觉格式具有任何重要性,那么消费/阅读软件的问题就是......

如果将XML存储在字符串类型列中,则可以存储所有内容,甚至是无效的XML。如果要在SQL Server中使用此XML与.value().nodes()等XML方法,则需要真实XML类型 ...如果可以控制,请确保目标是一个真正的XML类型变量或列!

在任何情况下都将省略xml声明(处理指令表明编码和大多数情况下的xml版本)。 SQL Server不接受具有其本机XML类型的此类声明。

如果将XML与字符串类型列一起存储在xml声明中,则会遇到麻烦。在这种情况下,您应该使用encoding="utf-16"必须将其存储在NVARCHAR(MAX)列中。

如果实际编码为NCHARNVARCHAR SQL Server需要unicode编码的字符串。如果列没有N,则SQL Server需要扩展ASCII (依赖于排序规则)。 您不能混用此内容!如果字符串为utf-16,则无法转换带有VARCHAR的xml声明的字符串(而反之亦然) 。

无论如何,应该避免使用ASCII编码的XML。这会让您陷入非拉丁字符的麻烦,并且需要昂贵的操作,因为SQL Server在内部将XML存储在基于unicode的树结构中。

关于命名空间,如果有的话,你必须非常小心。它们必须是XML的一部分,否则您将无法在以后读取XML。

this answer中,您可以找到将XDocument转换为XmlDocument的代码。然后使用property OuterXml获取XML的文本表示。由于C#内部使用unicode字符串,只需将其传递给XMLNVARCHAR(MAX)类型的变量或列。