2017-02-21 64 views
0

下面我有我從Web服務接收到的XML。我在C#中使用XML真的很新,但我試圖僅在<data_text>元素來自<form_id>。我想通過遍歷所有的XML來寫入SQL發送的內容。有沒有簡單的方法來設置這個,所以我可以找到<data_text>說從一個特定的<field_number>並分配給一個字符串,然後使用該字符串寫入SQL?一旦我可以將所有東西都寫入字符串,我可以輕鬆地寫入SQL,但是我無法將XML讀入字符串。我也願意接受其他選擇。在最底層,我擁有目前C#的位置,就我而言,目前爲止。在C中讀取多個XML元素並寫入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#-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

請exaplin你需要什麼,你的問題是不明確你要分析這個XML在C#或你想在SQL中解析? –

+0

嗨,你的編輯帶走了我的......在你的文字中,所有'都是隱形的。你必須把它們包裝起來。否則,這個問題是完全不清楚的...... – Shnugo

+0

編輯問題時,請務必小心,否則您將無法撤消之前的有益修改。 – Amy

回答

0

或者,你必須有你的C#發送XML到SQL Server存儲過程...,並允許存儲過程將數據分解成一個@holder表............,並從該@holder表執行你的CUD(創建,更新,刪除)操作。

像這樣:(存儲過程創建沒有顯示,只是相關的T-SQL代碼)

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

這是「基於集合」,所以碎化需要一點時間,但@holder的CUD操作將比Row By Row Insert/Update/Delete行執行得更好。獎金,一次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(); 
        }