删除xml编码属性

本文关键字:属性 编码 xml 删除 | 更新日期: 2023-09-27 18:00:11

我来自c++编程背景,我在c++中实现了一个项目,用xml消息从服务器发送和接收数据。我正在c#中重写代码,但我无法从服务器接收数据,因为服务器无法识别xml格式,因为它具有编码属性。服务器用vc++实现,其xml使用utf-16编码消息。我只需要删除我正在发送的xml消息中的编码属性。根据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);
        }
    }
}

删除xml编码属性

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

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

通常,最好避免使用字符串操作来操纵XML。然而,如果我处于这种情况,我会使用字符串操作来剪切encoding属性。我会小心这样做:类似的东西

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

如果该属性恰好在XML文档的其他位置,则可能会产生意外的副作用,即从该位置删除该属性。