2017-02-21 3 views
0

Ниже я использую свой XML, который я получаю из веб-сервиса. Я действительно новичок в работе с XML в C#, но я стараюсь читать элементы <data_text> только тогда, когда они от определенного <form_id>. Я хочу выполнить итерацию по всему XML для записи на SQL, что было отправлено. Есть ли простой способ установить это, чтобы я мог найти <data_text> с определенного <field_number> и назначить его String, а затем использовать эту String для записи в SQL? Как только я могу получить все в String, я могу легко написать SQL, но я не могу получить XML в Strings. Я открыт для других вариантов. Внизу у меня есть текущий C#, где я до сих пор с этим.Чтение нескольких элементов XML и запись на SQL В 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. 
      } 
     } 
+0

пожалуйста exaplin, что вам нужно вы вопрос не ясно, вы хотите, чтобы разобрать этот XML в C# или вы хотите анализировать SQL? –

+0

Привет, ваши правки забрали мою ... В вашем тексте все '' s невидимы. Вы должны обернуть их в backticks. В противном случае этот вопрос полностью неясен ... – Shnugo

+0

Будьте внимательны при редактировании вопросов, которые не отменят предыдущие полезные изменения. – Amy

ответ

0

в качестве альтернативы, вы должны иметь свой C# отправить XML в процедуру сервера хранится SQL ... и позволить хранимую процедуру для уничтожения данных в таблицу @holder ............ и выполнять операции CUD (создавать, обновлять, удалять) из этой таблицы @holder.

следующим образом: (хранимая процедура создают не отображается, только соответствующий код 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 
+0

Это сработало отлично. Время от времени мало, но оно работает. Благодаря! – b3ns

+0

Это «установлено на основе», поэтому для измельчения сделайте немного, но операция CUD от @holder будет работать лучше, чем Row By Row Insert/Update/Delete. Бонус, любые индексы восстанавливаются после операции CUD за один раз. – granadaCoder

+0

Хотя вы не должны использовать «OPENXML», подход такой же. См. Https://support.microsoft.com/en-us/help/315968/how-to-perform-bulk-updates-and-inserts-using-openxml-with-.net-providers-in-visual-c- .net Вот где я узнал этот трюк, в тот же день. – 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(); 
        }