我正在重写一个旧的应用程序,用于使用旧的.aspx表单上传XML文件。我们正在摆脱这种形式,并希望自动化这一过程。在我这样做的过程中,我发现XML格式存在差异,并且希望确保我以与旧应用程序相同的方式处理XML,因为另一个进程依赖于格式。
VB中的旧格式,使用MemoryStream,读取所有字节并返回Stream并创建一个大的内联SQL插入语句,以将数据加载到数据库中。
新格式使用C#和XDocument。这条线
XDocument.Load(fileName)
以正确的格式返回XML,但我没有看到XML标题,数据被花括号括起来 - > " {}"在Visual Studio的XML查看器中,数据看起来很好,所以这可能只是Visual Studio的残留物?
在任何情况下,我都需要在插入数据库时让XML包含标头。任何意见,将不胜感激!谢谢!
答案 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)
列中。
如果实际编码为NCHAR
或NVARCHAR
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字符串,只需将其传递给XML
或NVARCHAR(MAX)
类型的变量或列。