2017-02-21 14 views
0

以下、私は自分のXMLをWebサービスから受け取っています。私はC#でXMLを使って作業するのは本当に新しいですが、<data_text>の要素は、ある特定のもの(<form_id>)のものだけを読み込もうとしています。私は送信されたものをSQLに書き込むために、すべてのXMLを繰り返し処理したいと思います。これを設定する簡単な方法はありますか?具体的には<field_number>から<data_text>と言って、それをStringに割り当ててから、そのStringをSQLに書き込んでください。いったん私はすべての文字列を得ることができます私は簡単にSQLに書くことができますが、私は文字列にXMLを取得することはできません。私は他の選択肢も開いています。一番下には現在のC#があります。複数のXML要素を読み込み、C#でSQLに書き込む

<?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してくださいあなたはC#で、このXMLを解析したいですかんSQLで解析したいですか? –

+0

こんにちは、あなたの編集は私のものを取り去りました...あなたのテキストでは、すべての ' 'は見えません。あなたはバックティックでそれらをラップする必要があります。それ以外の場合、この質問は完全にはっきりしません。 – Shnugo

+0

以前の有益な編集を元に戻さない質問を編集するときは注意してください。 – Amy

答えて

0

を-code、あなたは、C#はSQL ServerのストアドプロシージャにXMLを送る持っている...とにデータを細断処理す​​るストアドプロシージャを許可しています@holderテーブル......... @holderテーブルからCUD(作成、更新、削除)操作を実行します。そのような

:(ストアドプロシージャの作成、ちょうど関連する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

これは "set based"なので、シュレッディングの作成には少し時間がかかりますが、@holderからのCUD操作は行ごとの挿入/更新/削除よりも優れています。ボーナス。一度にCUD操作後に再構築されるインデックス。 – granadaCoder

+0

"OPENXML"は使用しないでくださいが、アプローチは同じです。 https://support.microsoft.com/en-us/help/315968/how-to-perform-b​​ulk-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(); 
        } 
関連する問題