简体   繁体   中英

Read Multiple XML Elements And Write To SQL In C#

Below I have my XML that I am receiving from a web-service. I am really new with working with XML in C# but I am trying to read the <data_text> elements only when they are from a certain <form_id> . I want to iterate through all of the XML to write to SQL what was sent. Is there an easy way to set this up so I can find the <data_text> say from a specific <field_number> and assign it to a String, then use that String to write to SQL? Once I can get everything into a String I can easily write to SQL but I cannot get the XML into Strings. I am open to other options as well. At the bottom I have the current C# of where I am so far with this.

<?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>

Some C#-code

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.
            }
        }
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();
                    }

alternatively, you have have your c# send the xml to a sql server stored procedure...and allow the stored procedure to shred the data into a @holder table............and do your CUD ( create, update, delete) operations from that @holder table.

like so: (the stored procedure create is not shown, just the relevant tsql code)

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

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM