C# 删除xml编码属性 我从C++编程背景中,用C++实现了一个C++程序从服务器发送和接收数据,我在C语言中改写代码,因为服务器不能识别XML格式,因为它具有编码属性,所以不能从服务器接收数据。对其xml消息使用utf-16编码。我只需要删除正在发送的xml消息中的encoding属性。根据msdn论坛,要删除编码,我们必须将编码字段指定为null,以删除该属性。但是如果我提到第二个参数为null,那么程序似乎无法编译。我已经提到了下面的代码。请告诉我如何从xml消息中删除编码属性,以及编写tcp ip客户端以从服务器获取数据的最佳方法 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); } } } 使用系统; 使用System.Collections.Generic; 使用System.Linq; 使用系统文本; 使用System.IO; 使用System.Xml; 使用System.Net.Sockets; 命名空间Csharpproject.Exercises { 类Createxml { 静态void Main() { int随机; 随机数据=新随机(); random=data.Next(); StringWriter str=新的StringWriter(); XmlTextWriter xml=newxmltextwriter(str);//XmlTextWriter(str,null)给出错误 WriteStartDocument(); writeStarteElement(“App”); WriteAttributeString(“版本”,“1.0”); writeStarteElement(“请求”); WriteElementString(“MessageId”,random.ToString()); WriteElementString(“操作”、“GetAgentData”); WriteEndElement(); WriteEndElement(); xml.WriteEndDocument(); 字符串结果=str.ToString(); //控制台写入线(结果); Sockconnect(结果); } 静态公共连接(字符串数据) { /*创建TCP套接字*/ 字符串记录数据; /*将字符串转换为字节数据*/ byte[]data=Encoding.Default.GetBytes(数据); /*用于接收数据的缓冲区*/ 字节[]recv=新字节[4000]; /*发送的字节数*/ int sent=0; /*接收的字节数*/ 接收到的int=0; int datalen; datalen=data.Length; /*创建套接字*/ Socket s=新套接字(AddressFamily.InterNetwork、SocketType.Stream、ProtocolType.Tcp); /*本地连接*/ 尝试 { s、 连接(“127.0.0.1”,4916); } 捕获(异常ae) { WriteLine(“ArgumentNullException:{0}”,ae.ToString()); } 捕获(SocketException se) { WriteLine(“SocketException:{0}”,se.ToString()); } 捕获(例外e) { WriteLine(“意外异常:{0}”,e.ToString()); } Console.WriteLine(“连接成功”); Console.WriteLine(“发送数据”); /*发送数据*/ 做 { 尝试 { sent+=s.Send(数据,sent,datalen-sent,SocketFlags.None); } 捕获(SocketException se) { WriteLine(“意外异常:{0}”,se.ToString()); } }while(发送

C# 删除xml编码属性 我从C++编程背景中,用C++实现了一个C++程序从服务器发送和接收数据,我在C语言中改写代码,因为服务器不能识别XML格式,因为它具有编码属性,所以不能从服务器接收数据。对其xml消息使用utf-16编码。我只需要删除正在发送的xml消息中的encoding属性。根据msdn论坛,要删除编码,我们必须将编码字段指定为null,以删除该属性。但是如果我提到第二个参数为null,那么程序似乎无法编译。我已经提到了下面的代码。请告诉我如何从xml消息中删除编码属性,以及编写tcp ip客户端以从服务器获取数据的最佳方法 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); } } } 使用系统; 使用System.Collections.Generic; 使用System.Linq; 使用系统文本; 使用System.IO; 使用System.Xml; 使用System.Net.Sockets; 命名空间Csharpproject.Exercises { 类Createxml { 静态void Main() { int随机; 随机数据=新随机(); random=data.Next(); StringWriter str=新的StringWriter(); XmlTextWriter xml=newxmltextwriter(str);//XmlTextWriter(str,null)给出错误 WriteStartDocument(); writeStarteElement(“App”); WriteAttributeString(“版本”,“1.0”); writeStarteElement(“请求”); WriteElementString(“MessageId”,random.ToString()); WriteElementString(“操作”、“GetAgentData”); WriteEndElement(); WriteEndElement(); xml.WriteEndDocument(); 字符串结果=str.ToString(); //控制台写入线(结果); Sockconnect(结果); } 静态公共连接(字符串数据) { /*创建TCP套接字*/ 字符串记录数据; /*将字符串转换为字节数据*/ byte[]data=Encoding.Default.GetBytes(数据); /*用于接收数据的缓冲区*/ 字节[]recv=新字节[4000]; /*发送的字节数*/ int sent=0; /*接收的字节数*/ 接收到的int=0; int datalen; datalen=data.Length; /*创建套接字*/ Socket s=新套接字(AddressFamily.InterNetwork、SocketType.Stream、ProtocolType.Tcp); /*本地连接*/ 尝试 { s、 连接(“127.0.0.1”,4916); } 捕获(异常ae) { WriteLine(“ArgumentNullException:{0}”,ae.ToString()); } 捕获(SocketException se) { WriteLine(“SocketException:{0}”,se.ToString()); } 捕获(例外e) { WriteLine(“意外异常:{0}”,e.ToString()); } Console.WriteLine(“连接成功”); Console.WriteLine(“发送数据”); /*发送数据*/ 做 { 尝试 { sent+=s.Send(数据,sent,datalen-sent,SocketFlags.None); } 捕获(SocketException se) { WriteLine(“意外异常:{0}”,se.ToString()); } }while(发送,c#,xml,C#,Xml,由于没有XmlWriter构造函数接受TextWriter和编码,因此会出现编译器错误。链接到的构造函数采用文件名(而不是TextWriter)和编码 即使您使用另一个XmlTextWriter构造函数,并将编码设置为null,当您说您的服务器使用UTF-16时,您的XML文档也将使用UTF-8写出 通常,避免使用字符串操作操作XML是最佳实践。但是,如果我是在这种情况下,我会使用字符串操作将编码属性切掉。我会小心这样做:比如 result = result.Replace(" encoding

由于没有
XmlWriter
构造函数接受
TextWriter
编码,因此会出现编译器错误。链接到的构造函数采用文件名(而不是
TextWriter
)和编码

即使您使用另一个
XmlTextWriter
构造函数,并将编码设置为
null
,当您说您的服务器使用UTF-16时,您的XML文档也将使用UTF-8写出

通常,避免使用字符串操作操作XML是最佳实践。但是,如果我是在这种情况下,我会使用字符串操作将
编码
属性切掉。我会小心这样做:比如

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

如果该属性碰巧存在于XML文档中,则可能会产生意外的副作用,即从XML文档中的其他位置删除该属性

这个建议不错,但似乎不起作用。我浏览了internet上的示例,其中他们执行了序列化并通过套接字发送数据。我们必须在这里做同样的事情吗。在这里,我将字符串数据转换成字节数组并通过套接字发送。@blitz:“它似乎不起作用”?有错误吗?如果有,信息是什么?”它似乎不起作用“没有太多事情要做。很抱歉没有正确更新回复。我想说的是,服务器仍然拒绝我通过套接字发送的xml。那么,在c#中,这是正确的方法吗?还是有更好的方法。@blitz:服务器是否返回了更详细的消息,或者只是一般的失败消息?我认为您的C#代码很好,但是如果指定了
encoding
属性,那么您的服务器确实无法解析XML文档,那么问题就出在服务器上。尽管如此,这可能值得再次检查