2017-02-21 67 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(); 
        }