2014-04-26 101 views
0

我來自c + +編程背景,我已經在C++中實現了一個項目,使用xml消息發送和接收來自服務器的數據。我在c#中重寫代碼,我無法接收作爲服務器的服務器的數據無法識別xml格式,因爲它具有encoding屬性。服務器在vC++中實現,併爲其xml消息使用utf-16編碼。我只需要刪除我發送的xml消息中的encoding屬性。根據msdn論壇http://msdn.microsoft.com/en-us/library/5366y21d.aspx刪除編碼,我們必須提及編碼字段爲空以刪除屬性。但是,如果我提到第二個參數爲空,程序似乎沒有編譯。我已經提到了下面的代碼。請讓我知道如何從xml消息中刪除編碼屬性,以及編寫tcp ip客戶端以從服務器獲取數據的最佳方式。刪除xml編碼屬性

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using System.IO; 
using System.Xml; 
using System.Net.Sockets; 


namespace Csharpproject.Exercises 
{ 
    class Createxml 
    { 


     static void Main() 
     { 

      int random; 
      Random data = new Random(); 
      random=data.Next(); 


      StringWriter str = new StringWriter(); 

      XmlTextWriter xml = new XmlTextWriter(str); //XmlTextWriter(str,null)gives error 

      xml.WriteStartDocument(); 



      xml.WriteStartElement("App"); 

      xml.WriteAttributeString("version", "1.0"); 



      xml.WriteStartElement("request"); 


      xml.WriteElementString("MessageId",random.ToString()); 


      xml.WriteElementString("operation","GetAgentData"); 

      xml.WriteEndElement(); 


      xml.WriteEndElement(); 

      xml.WriteEndDocument(); 

      string result = str.ToString(); 



      // Console.WriteLine(result); 

      Sockconnect(result); 

     } 

     static public void Sockconnect(string Data) 
     { 
      /* creating an TCP Socket */ 

      string Recvdata; 

      /* convert string to byte data */ 

      byte[] data = Encoding.Default.GetBytes(Data); 

     /*buffer to receive the data */ 

      byte[] recv=new byte[4000]; 

     /* number of bytes sent */ 
      int sent = 0; 

      /* number of bytes received */ 
      int received = 0; 

      int datalen; 


      datalen = data.Length; 

     /* create socket */ 
      Socket s = new Socket(AddressFamily.InterNetwork,SocketType.Stream, ProtocolType.Tcp); 
     /* connect locally */ 
      try 
      { 
       s.Connect("127.0.0.1", 4916); 
      } 
      catch (ArgumentNullException ae) 
      { 
       Console.WriteLine("ArgumentNullException : {0}", ae.ToString()); 

      } 
      catch (SocketException se) 
      { 
       Console.WriteLine("SocketException : {0}", se.ToString()); 

      } 
      catch (Exception e) 
      { 
       Console.WriteLine("Unexpected exception : {0}", e.ToString()); 
      } 

      Console.WriteLine("Connected successfully "); 

      Console.WriteLine("Sending the data "); 

      /* send the data */ 
      do 
      { 

       try 
       { 
        sent += s.Send(data, sent, datalen - sent, SocketFlags.None); 
       } 
       catch (SocketException se) 
       { 
        Console.WriteLine("Unexpected exception : {0}", se.ToString()); 
       } 

      } while (sent < datalen); 

      Console.WriteLine("Sent Successfully "); 

      /* receive the data */ 

      try 
      { 

       received = s.Receive(recv, SocketFlags.None); 

      } 
      catch (SocketException se) 
      { 
       Console.WriteLine("SocketException : {0}", se.ToString()); 
      } 

      Console.WriteLine("Received some data"); 

      Recvdata = System.Text.Encoding.Default.GetString(recv); 

      Console.WriteLine(Recvdata); 

     } 

    } 
} 

回答

1

你得到一個編譯錯誤,因爲沒有XmlWriter構造函數,一個TextWriterEncoding。你鏈接到的構造函數需要一個文件名(不是TextWriter)和一個編碼。

即使您使用編碼爲null的其他XmlTextWriter構造函數之一,當您聲明服務器使用UTF-16時,您的XML文檔將使用UTF-8編寫出來。

通常最好避免使用字符串操作來操作XML。但是,如果我處於這種情況,我會使用字符串操作來切斷encoding屬性。這樣做,我會小心:像

result = result.Replace(" encoding=\"utf-16\"", ""); 

可能有,如果它發生在那裏的XML文檔中去除其他地方這個屬性的意想不到的副作用。

+0

好的建議,但它似乎沒有工作。我通過互聯網上的例子,他們已經執行序列化並通過套接字發送數據。我們必須在這裏做同樣的事情。我將字符串數據轉換爲字節數組並通過套接字發送。 – blitz

+0

@blitz:'它似乎沒有工作'?是否有錯誤?如果有,錯誤信息是什麼? '它似乎沒有工作'是不是很多繼續下去。 –

+0

抱歉沒有正確更新答覆。我想說的是,服務器仍然拒絕我通過套接字發送的xml。那麼這是以c#做事情的正確方式,還是有更好的方法去做。 – blitz