删除xml编码属性

时间:2014-04-26 11:34:39

标签: c# xml

我来自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);

        }

    }
}

1 个答案:

答案 0 :(得分:1)

您收到编译器错误,因为没有XmlWriter构造函数带有TextWriterEncoding。您链接到的构造函数采用文件名(不是TextWriter)和编码。

即使您使用编码为XmlTextWriter的其他null构造函数之一,当您说服务器使用UTF时,您的XML文档也将使用UTF-8编写16。

通常,最好不要使用字符串操作来操纵XML。但是,如果我遇到这种情况,我会使用字符串操作来删除encoding属性。我会小心这样做:像

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

可能会出现意外的副作用,即如果碰巧出现在XML文档中的其他位置,则会删除此属性。