如何将带有 xml 后代的 XElement 导入 SQL Server
Posted
技术标签:
【中文标题】如何将带有 xml 后代的 XElement 导入 SQL Server【英文标题】:How to get XElement with xml Descendants into SQL Server 【发布时间】:2019-07-19 04:35:35 【问题描述】:我需要帮助才能使用 XElement 将我的 XML 元素导入 SQL Server。当我运行代码时,MessageBox.Show(element.ToString(), "element.value");
在 MessageBox 中正确显示<FIELD fieldName="ID">1234567</FIELD>
和<FIELD fieldName="DateTime">05/02/2018 09:00:28</FIELD>
。我现在可以使用它上传到我在 SQL Server 中的 tblMain 吗?
基本上,它是一个字符串,作为 Outlook 中 .msg 正文的输入保存。此消息正文将正文中的所有文本作为 XML 格式作为纯文本格式。
我将字符串输入作为 xml 文档加载到 XmlDocument 中。
然后我使用 XElement 将此输入解析为 xml。我创建了一个变量 xitems,其 xml 后代为 ("FIELD"),我在其中运行一个 foreach 循环作为 xitems 中的变量元素。输出现在显示在 MessageBox 中。
请,我正在寻找的是有关如何将其导入 SQL Server 到名为 tblMain 的表的详细帮助,为简单起见,它有两列 ID 和 DateTime?
代码:
for (int i = 1; i < publicFolder.Items.Count; i++)
item = (PostItem)publicFolder.Items[i];
if (item != null)
//MessageBox.Show(item.Body, "Body");
//save the msg body into the string
string input = item.Body;
//load the string input as xml document
XmlDocument doc = new XmlDocument();
doc.LoadXml(input);
XElement xml = XElement.Parse(input);
var xitems = xml.Descendants("FIELD");
foreach (var element in xitems)
MessageBox.Show(element.ToString(), "element.value");
////Create new instance of SQL Connection
//SqlConnection conn = new SqlConnection();
xml文件为:https://imgur.com/a/epCLd22
【问题讨论】:
有人吗?上传xml到sql的人应该很熟悉吧? 目前还不清楚您尝试了什么。在我看来,您应该能够将 XML 部分与 SQL 部分完全分开。您不能只创建一个 SqlCommand 来执行插入,从 XElement 填充值吗?如果这听起来可行,那么哪一点会导致您出现问题?请注意,您可以完全单独研究它的每个部分。 【参考方案1】:此 SQL 代码可以指导您如何完成任务:
DECLARE @ColNamesCommaSeparated NVARCHAR(MAX)
DECLARE @ValuesCommaSeparated NVARCHAR(MAX)
DECLARE @xml XML
SET @xml = '
<ROOT>
<FIELD fieldName="ID">1234567</FIELD>
<FIELD fieldName="DateTime">05/02/2018 09:00:28</FIELD>
</ROOT>
'
;WITH Result AS
(
SELECT
T.n.value('@fieldName','VARCHAR(100)') AS ColName,
T.n.value('.','VARCHAR(100)') AS Val
FROM @xml.nodes('/ROOT/*') T(n)
)
SELECT @ColNamesCommaSeparated =
STUFF(
(SELECT ', ' + ColName
FROM Result
FOR XML PATH ('')), 1, 1, ''),
@ValuesCommaSeparated =
STUFF(
(SELECT ', ' + '''' + Val + ''''
FROM Result
FOR XML PATH ('')), 1, 1, '')
DECLARE @sqlCommand NVARCHAR(MAX)
SET @sqlCommand = 'INSERT INTO tblMain (' + @ColNamesCommaSeparated + ') VALUES (' + @ValuesCommaSeparated + ')'
EXEC(@sqlCommand)
因此,您可以创建一个接受您的 xml 作为传递参数的存储过程。然后在你的 c# 代码中执行这个 sp。
【讨论】:
以上是关于如何将带有 xml 后代的 XElement 导入 SQL Server的主要内容,如果未能解决你的问题,请参考以下文章
如何使用 XElement.Parse 解析 XML 而无需查看/将实体更改为字符?
在 C# Compact Framework 中加速 XML 的解析(使用 XmlTextReader 和 XElement)?