【问题标题】:Read Multiple XML Elements And Write To SQL In C#在 C# 中读取多个 XML 元素并写入 SQL
【发布时间】:2017-02-21 15:07:31
【问题描述】:

下面是我从网络服务接收的 XML。我对在 C# 中使用 XML 非常陌生,但我仅在 <data_text> 元素来自某个 <form_id> 时才尝试读取它们。我想遍历所有 XML 以将发送的内容写入 SQL。有没有一种简单的方法来设置它,以便我可以从特定的<field_number> 中找到<data_text> 并将其分配给一个字符串,然后使用该字符串写入 SQL?一旦我可以将所有内容都转换为字符串,我就可以轻松地写入 SQL,但我无法将 XML 转换为字符串。我也对其他选择持开放态度。在底部,我有目前的 C#,我目前为止。

<?xml version="1.0" encoding="ISO-8859-1"?>
<!DOCTYPE pnet_message_history_packet_response PUBLIC>
<pnet_message_history_packet_response>
    <packet_id>2</packet_id>
    <imessage>
        <vehicle_number>Test1</vehicle_number>
        <created_datetime>02/20/2017 19:33:28</created_datetime>
        <received_datetime>02/20/2017 19:33:53</received_datetime>
        <recipient>
            <recip_uid>1234</recip_uid>
            <recip_name>TestRecip</recip_name>
        </recipient>
        <msn>1233</msn>
        <base_msn>1234</base_msn>
        <message_type>form</message_type>
        <formdata>
            <form_id>55555</form_id>
            <im_field>
                <field_number>5</field_number>
                <empty_at_start>no</empty_at_start>
                <driver_modified>no</driver_modified>
                <data>
                    <data_text>Test5</data_text>
                </data>
            </im_field>
            <im_field>
                <field_number>6</field_number>
                <empty_at_start>yes</empty_at_start>
                <driver_modified>yes</driver_modified>
                <data>
                    <data_text>Test6</data_text>
                </data>
            </im_field>
            <im_field>
                <field_number>7</field_number>
                <empty_at_start>yes</empty_at_start>
                <driver_modified>yes</driver_modified>
                <data>
                    <data_text>Test7</data_text>
                </data>
            </im_field>
            <im_field>
                <field_number>8</field_number>
                <empty_at_start>yes</empty_at_start>
                <driver_modified>yes</driver_modified>
                <data>
                    <data_date-time>09/09/09 09:09:00</data_date-time>
                </data>
            </im_field>
            <im_field>
                <field_number>9</field_number>
                <empty_at_start>yes</empty_at_start>
                <driver_modified>yes</driver_modified>
                <data>
                    <data_date-time>09/09/09 09:09:00</data_date-time>
                </data>
            </im_field>
            <im_field>
                <field_number>10</field_number>
                <empty_at_start>no</empty_at_start>
                <driver_modified>no</driver_modified>
                <data>
                    <data_text>Test10</data_text>
                </data>
            </im_field>
        </formdata>
    </imessage>
    <imessage>
        <vehicle_number>Test1</vehicle_number>
        <created_datetime>02/20/2017 19:34:04</created_datetime>
        <received_datetime>02/20/2017 19:34:19</received_datetime>
        <recipient>
            <recip_uid>1234</recip_uid>
            <recip_name>TestRecip</recip_name>
        </recipient>
        <msn>1235</msn>
        <base_msn>1236</base_msn>
        <message_type>form</message_type>
        <formdata>
            <form_id>55555</form_id>
            <im_field>
                <field_number>5</field_number>
                <empty_at_start>no</empty_at_start>
                <driver_modified>no</driver_modified>
                <data>
                    <data_text>Test52</data_text>
                </data>
            </im_field>
            <im_field>
                <field_number>6</field_number>
                <empty_at_start>yes</empty_at_start>
                <driver_modified>yes</driver_modified>
                <data>
                    <data_text>Test62</data_text>
                </data>
            </im_field>
            <im_field>
                <field_number>7</field_number>
                <empty_at_start>yes</empty_at_start>
                <driver_modified>yes</driver_modified>
                <data>
                    <data_text>Test72</data_text>
                </data>
            </im_field>
            <im_field>
                <field_number>8</field_number>
                <empty_at_start>yes</empty_at_start>
                <driver_modified>yes</driver_modified>
                <data>
                    <data_date-time>09/08/09 09:08:00</data_date-time>
                </data>
            </im_field>
            <im_field>
                <field_number>9</field_number>
                <empty_at_start>yes</empty_at_start>
                <driver_modified>yes</driver_modified>
                <data>
                    <data_date-time>09/08/09 08:09:00</data_date-time>
                </data>
            </im_field>
            <im_field>
                <field_number>10</field_number>
                <empty_at_start>no</empty_at_start>
                <driver_modified>no</driver_modified>
                <data>
                    <data_text>Test102</data_text>
                </data>
            </im_field>
        </formdata>
    </imessage>
</pnet_message_history_packet_response>

一些C#代码

protected void GetMessages()
        {
            XmlDocument xmldoc = new XmlDocument();
            xmldoc.PreserveWhitespace = false;

            Regex regex = new Regex(@"^\s+$[\r\n]*");
            String cleanedXml = regex.Replace(postXMLData(URL, prefix, "POST"), "><").TrimStart();
            xmldoc.LoadXml(cleanedXml);

            XmlNodeList messageList = xmldoc.GetElementsByTagName("imessage");

            foreach (XmlNode node in messageList)
            {
                XmlElement messageElement = (XmlElement)node;
                String Arrival;

                Arrival = messageElement.GetElementsByTagName("data_text")[0].InnerText;

                testTxtBx.Text += Arrival; //I am just trying to write to a Textbox now to see the results.
            }
        }

【问题讨论】:

  • 请说明你需要什么你的问题不清楚你想用C#解析这个xml还是用SQL解析?
  • 嗨,你的编辑带走了我的……在你的文字中,所有&lt;someXmlTag&gt;s 都是不可见的。您必须将它们包装在反引号中。否则这个问题完全不清楚......
  • 在编辑问题时请小心不要撤消以前的有益编辑。
  • 我想我可能已经修复了更改的覆盖问题。这有帮助吗?
  • 您无法使用正则表达式解析 XML。 XML 不是常规语言。

标签: c# sql sql-server xml


【解决方案1】:

或者,您让您的 c# 将 xml 发送到 sql server 存储过程......并允许存储过程将数据切碎到 @holder 表中............然后做您从该 @holder 表中执行 CUD(创建、更新、删除)操作。

像这样:(存储过程create没有显示,只是相关的tsql代码)

declare @xml xml

select @xml =
'


<pnet_message_history_packet_response>
    <packet_id>2</packet_id>
    <imessage>
        <vehicle_number>Test1</vehicle_number>
        <created_datetime>02/20/2017 19:33:28</created_datetime>
        <received_datetime>02/20/2017 19:33:53</received_datetime>
        <recipient>
            <recip_uid>1234</recip_uid>
            <recip_name>TestRecip</recip_name>
        </recipient>
        <msn>1233</msn>
        <base_msn>1234</base_msn>
        <message_type>form</message_type>
        <formdata>
            <form_id>55555</form_id>
            <im_field>
                <field_number>5</field_number>
                <empty_at_start>no</empty_at_start>
                <driver_modified>no</driver_modified>
                <data>
                    <data_text>Test5</data_text>
                </data>
            </im_field>
            <im_field>
                <field_number>6</field_number>
                <empty_at_start>yes</empty_at_start>
                <driver_modified>yes</driver_modified>
                <data>
                    <data_text>Test6</data_text>
                </data>
            </im_field>
            <im_field>
                <field_number>7</field_number>
                <empty_at_start>yes</empty_at_start>
                <driver_modified>yes</driver_modified>
                <data>
                    <data_text>Test7</data_text>
                </data>
            </im_field>
            <im_field>
                <field_number>8</field_number>
                <empty_at_start>yes</empty_at_start>
                <driver_modified>yes</driver_modified>
                <data>
                    <data_date-time>09/09/09 09:09:00</data_date-time>
                </data>
            </im_field>
            <im_field>
                <field_number>9</field_number>
                <empty_at_start>yes</empty_at_start>
                <driver_modified>yes</driver_modified>
                <data>
                    <data_date-time>09/09/09 09:09:00</data_date-time>
                </data>
            </im_field>
            <im_field>
                <field_number>10</field_number>
                <empty_at_start>no</empty_at_start>
                <driver_modified>no</driver_modified>
                <data>
                    <data_text>Test10</data_text>
                </data>
            </im_field>
        </formdata>
    </imessage>
    <imessage>
        <vehicle_number>Test1</vehicle_number>
        <created_datetime>02/20/2017 19:34:04</created_datetime>
        <received_datetime>02/20/2017 19:34:19</received_datetime>
        <recipient>
            <recip_uid>1234</recip_uid>
            <recip_name>TestRecip</recip_name>
        </recipient>
        <msn>1235</msn>
        <base_msn>1236</base_msn>
        <message_type>form</message_type>
        <formdata>
            <form_id>55555</form_id>
            <im_field>
                <field_number>5</field_number>
                <empty_at_start>no</empty_at_start>
                <driver_modified>no</driver_modified>
                <data>
                    <data_text>Test52</data_text>
                </data>
            </im_field>
            <im_field>
                <field_number>6</field_number>
                <empty_at_start>yes</empty_at_start>
                <driver_modified>yes</driver_modified>
                <data>
                    <data_text>Test62</data_text>
                </data>
            </im_field>
            <im_field>
                <field_number>7</field_number>
                <empty_at_start>yes</empty_at_start>
                <driver_modified>yes</driver_modified>
                <data>
                    <data_text>Test72</data_text>
                </data>
            </im_field>
            <im_field>
                <field_number>8</field_number>
                <empty_at_start>yes</empty_at_start>
                <driver_modified>yes</driver_modified>
                <data>
                    <data_date-time>09/08/09 09:08:00</data_date-time>
                </data>
            </im_field>
            <im_field>
                <field_number>9</field_number>
                <empty_at_start>yes</empty_at_start>
                <driver_modified>yes</driver_modified>
                <data>
                    <data_date-time>09/08/09 08:09:00</data_date-time>
                </data>
            </im_field>
            <im_field>
                <field_number>10</field_number>
                <empty_at_start>no</empty_at_start>
                <driver_modified>no</driver_modified>
                <data>
                    <data_text>Test102</data_text>
                </data>
            </im_field>
        </formdata>
    </imessage>
</pnet_message_history_packet_response>


'


declare @holder table ( FormId int, DataText varchar(64) )

insert into @holder (FormId, DataText)


SELECT 
     T.MyEntity.value('../../form_id[1]', 'INT') AS ProgramId
    ,T.MyEntity.value('data_text[1]', 'VARCHAR(256)') AS SharedAccessKeyName
FROM @xml.nodes('pnet_message_history_packet_response/imessage/formdata/im_field/data') AS T(MyEntity);


select * from @holder

【讨论】:

  • 这很好用。有时有点慢,但它的工作原理。谢谢!
  • 这是“基于集合的”,因此粉碎需要一点时间,但来自 @holder 的 CUD 操作将比逐行插入/更新/删除执行得更好。奖励,在 CUD 操作后一次重建任何索引。
  • 虽然您不应该使用“OPENXML”,但方法是相同的。见support.microsoft.com/en-us/help/315968/…这是我当年学到这个技巧的地方。
【解决方案2】:
static void Main(string[] args)
                    {
                        var xml =
                            @"<pnet_message_history_packet_response>
                <packet_id>2</packet_id>
                <imessage>
                    <vehicle_number>Test1</vehicle_number>
                    <created_datetime>02/20/2017 19:33:28</created_datetime>
                    <received_datetime>02/20/2017 19:33:53</received_datetime>
                    <recipient>
                        <recip_uid>1234</recip_uid>
                        <recip_name>TestRecip</recip_name>
                    </recipient>
                    <msn>1233</msn>
                    <base_msn>1234</base_msn>
                    <message_type>form</message_type>
                    <formdata>
                        <form_id>55555</form_id>
                        <im_field>
                            <field_number>5</field_number>
                            <empty_at_start>no</empty_at_start>
                            <driver_modified>no</driver_modified>
                            <data>
                                <data_text>Test5</data_text>
                            </data>
                        </im_field>
                        <im_field>
                            <field_number>6</field_number>
                            <empty_at_start>yes</empty_at_start>
                            <driver_modified>yes</driver_modified>
                            <data>
                                <data_text>Test6</data_text>
                            </data>
                        </im_field>
                        <im_field>
                            <field_number>7</field_number>
                            <empty_at_start>yes</empty_at_start>
                            <driver_modified>yes</driver_modified>
                            <data>
                                <data_text>Test7</data_text>
                            </data>
                        </im_field>
                        <im_field>
                            <field_number>8</field_number>
                            <empty_at_start>yes</empty_at_start>
                            <driver_modified>yes</driver_modified>
                            <data>
                                <data_date-time>09/09/09 09:09:00</data_date-time>
                            </data>
                        </im_field>
                        <im_field>
                            <field_number>9</field_number>
                            <empty_at_start>yes</empty_at_start>
                            <driver_modified>yes</driver_modified>
                            <data>
                                <data_date-time>09/09/09 09:09:00</data_date-time>
                            </data>
                        </im_field>
                        <im_field>
                            <field_number>10</field_number>
                            <empty_at_start>no</empty_at_start>
                            <driver_modified>no</driver_modified>
                            <data>
                                <data_text>Test10</data_text>
                            </data>
                        </im_field>
                    </formdata>
                </imessage>
                <imessage>
                    <vehicle_number>Test1</vehicle_number>
                    <created_datetime>02/20/2017 19:34:04</created_datetime>
                    <received_datetime>02/20/2017 19:34:19</received_datetime>
                    <recipient>
                        <recip_uid>1234</recip_uid>
                        <recip_name>TestRecip</recip_name>
                    </recipient>
                    <msn>1235</msn>
                    <base_msn>1236</base_msn>
                    <message_type>form</message_type>
                    <formdata>
                        <form_id>55555</form_id>
                        <im_field>
                            <field_number>5</field_number>
                            <empty_at_start>no</empty_at_start>
                            <driver_modified>no</driver_modified>
                            <data>
                                <data_text>Test52</data_text>
                            </data>
                        </im_field>
                        <im_field>
                            <field_number>6</field_number>
                            <empty_at_start>yes</empty_at_start>
                            <driver_modified>yes</driver_modified>
                            <data>
                                <data_text>Test62</data_text>
                            </data>
                        </im_field>
                        <im_field>
                            <field_number>7</field_number>
                            <empty_at_start>yes</empty_at_start>
                            <driver_modified>yes</driver_modified>
                            <data>
                                <data_text>Test72</data_text>
                            </data>
                        </im_field>
                        <im_field>
                            <field_number>8</field_number>
                            <empty_at_start>yes</empty_at_start>
                            <driver_modified>yes</driver_modified>
                            <data>
                                <data_date-time>09/08/09 09:08:00</data_date-time>
                            </data>
                        </im_field>
                        <im_field>
                            <field_number>9</field_number>
                            <empty_at_start>yes</empty_at_start>
                            <driver_modified>yes</driver_modified>
                            <data>
                                <data_date-time>09/08/09 08:09:00</data_date-time>
                            </data>
                        </im_field>
                        <im_field>
                            <field_number>10</field_number>
                            <empty_at_start>no</empty_at_start>
                            <driver_modified>no</driver_modified>
                            <data>
                                <data_text>Test102</data_text>
                            </data>
                        </im_field>
                    </formdata>
                </imessage>
            </pnet_message_history_packet_response>";

                        XmlDocument xmldoc = new XmlDocument();
                        xmldoc.PreserveWhitespace = false;

                        Regex regex = new Regex(@"^\s+$[\r\n]*");
                        //String cleanedXml = regex.Replace(xml(URL, prefix, "POST"), "><").TrimStart();
                        xmldoc.LoadXml(xml);

                       // var list = from ws in doc.Descendants("formdata").ToList() ;

                        TextReader tr = new StringReader(xml);
                        XDocument doc = XDocument.Load(tr);

                        var list = (from root in doc.Descendants("imessage")
                                    select new
                        {
                            p = root.Element("vehicle_number") != null ? root.Element("vehicle_number").Value : string.Empty ,

                            formdata= (from fdata in root.Descendants("formdata")
                                       select new { x= fdata.Element("form_id") != null ? fdata.Element("form_id").Value : string.Empty ,  }
                                       ).ToList()
                        } 



                        ).ToList();


                        Console.ReadLine();
                    }

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-04-03
    • 2016-08-30
    • 2016-03-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多