2017-02-21 1 views
0

Unten habe ich meine XML, die ich von einem Web-Service erhalte. Ich bin wirklich neu mit der Arbeit mit XML in C#, aber ich versuche, die <data_text> Elemente nur zu lesen, wenn sie aus einer bestimmten <form_id> sind. Ich möchte das gesamte XML durchlaufen, um in SQL zu schreiben, was gesendet wurde. Gibt es eine einfache Möglichkeit, dies einzurichten, so kann ich die <data_text> sagen, von einem bestimmten <field_number> und ordnen Sie es zu einem String, dann verwenden Sie diesen String in SQL schreiben? Sobald ich alles in einen String bekommen kann, kann ich leicht in SQL schreiben, aber ich kann das XML nicht in Strings bekommen. Ich bin offen für andere Optionen. Ganz unten habe ich die aktuelle C# von wo ich soweit bin.Mehrere XML-Elemente lesen und in SQL schreiben In 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> 

Einige 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. 
      } 
     } 
+0

bitte exaplin was Sie brauchen Sie Frage nicht klar ist, tun Sie das XML in C# analysieren möchten oder Sie möchte SQL analysieren? –

+0

Hallo, deine Änderungen nahmen meine ... In deinem Text sind alle ''s unsichtbar. Sie müssen sie in Backticks wickeln. Ansonsten ist diese Frage völlig unklar ... – Shnugo

+0

Bitte seien Sie vorsichtig bei der Bearbeitung von Fragen, dass Sie frühere vorteilhafte Änderungen nicht rückgängig machen. – Amy

Antwort

0

alternativ Sie Ihre C# haben senden, um die XML zu einem SQL Server gespeicherte Prozedur haben ... und lassen Sie die gespeicherte Prozedur, die Daten zu vernichten in eine @holder-Tabelle ............ und führen Sie Ihre CUD-Operationen (create, update, delete) aus dieser @holder-Tabelle aus.

wie so:

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 
(die gespeicherte Prozedur erstellen, ist nicht nur die entsprechende Tsql Code gezeigt)
+0

Das hat gut funktioniert. Manchmal etwas langsam, aber es funktioniert. Vielen Dank! – b3ns

+0

Dies ist "set based", so dass das Shredding etwas dauert, aber die CUD-Operation vom @ holder wird besser funktionieren als eine Zeile für Zeile Einfügen/Aktualisieren/Löschen. Bonus, alle Indizes werden nach der CUD-Operation gleichzeitig neu erstellt. – granadaCoder

+0

Während Sie "OPENXML" nicht verwenden sollten, ist der Ansatz derselbe. Siehe https://support.microsoft.com/en-us/help/315968/how-to-perform-bulk-updates-and-inserts-using-openxml-with-.net-providers-in-visual-c- .net Hier habe ich diesen Trick gelernt, damals. – granadaCoder

0
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(); 
        } 
Verwandte Themen