如何将带有 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 创建带有名称空间和模式的 XML

如何使用 XElement.Parse 解析 XML 而无需查看/将实体更改为字符?

如何将 XElement 插入现有的 xml 文件?

在 C# Compact Framework 中加速 XML 的解析(使用 XmlTextReader 和 XElement)?

将 XML 提要读入 XElement

c#如何用xelement读取xml属性