我来自c ++编程背景,我用c ++实现了一个项目,使用xml消息从服务器发送和接收数据。我在c#中重写代码,我无法从c#中接收数据服务器因服务器无法识别xml格式,因为它具有编码属性。服务器在vc ++中实现,并对其xml消息使用utf-16编码。我只需要删除我发送的xml消息中的encoding属性。根据msdn论坛http://msdn.microsoft.com/en-us/library/5366y21d.aspx删除编码,我们必须提及编码字段为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);
}
}
}
答案 0 :(得分:1)
您收到编译器错误,因为没有XmlWriter
构造函数带有TextWriter
和Encoding
。您链接到的构造函数采用文件名(不是TextWriter
)和编码。
即使您使用编码为XmlTextWriter
的其他null
构造函数之一,当您说服务器使用UTF时,您的XML文档也将使用UTF-8编写16。
通常,最好不要使用字符串操作来操纵XML。但是,如果我遇到这种情况,我会使用字符串操作来删除encoding
属性。我会小心这样做:像
result = result.Replace(" encoding=\"utf-16\"", "");
可能会出现意外的副作用,即如果碰巧出现在XML文档中的其他位置,则会删除此属性。