代码之家  ›  专栏  ›  技术社区  ›  Ian Kemp David Boike

保存省略元素

  •  1
  • Ian Kemp David Boike  · 技术社区  · 14 年前

    我有以下在运行时使用 XmlDocument :

    <?xml version="1.0" standalone="yes"?>
    <NewConfig xmlns="http://tempuri.org/NewConfig.xsd">
      <SystemReference xmlns="">
        <ID>1</ID>
        <Name>CountryName</Name>
      </SystemReference>
      <ClientList xmlns="">
        <Type>Private</Type>
    
        <!-- elements omitted... -->
    
        <VAT>1234567890</VAT>
      </ClientList>
    </NewConfig>
    

    我将用以下代码将此XML保存到TCP套接字:

    TcpClient client = ...
    XmlDocument configDocument = ...
    
    using (StreamWriter writer = new StreamWriter(client.GetStream()))
    {
      writer.AutoFlush = true;
      configDocument.Save(writer);
      writer.WriteLine();
    }
    

    但这会导致套接字另一端接收到的XML被截断-最后2个元素( </ClientList> </NewConfig> )永远不存在。

    但是,如果使用以下代码,XML将成功发送:

    TcpClient client = ...
    XmlDocument configDocument = ...
    
    using (StreamWriter writer = new StreamWriter(client.GetStream()))
    {
      writer.AutoFlush = true;
      writer.WriteLine(configDocument.OuterXml);
    }
    

    因此,我的问题是:有人知道为什么吗? XmlDocument.Save() 在写入时似乎忽略了结束元素 Stream ?

    1 回复  |  直到 14 年前
        1
  •  1
  •   Darin Dimitrov    14 年前

    两种发送数据的方法都没有问题。错误的是您在服务器端读取XML的方式。例如,使用第一个方法和下面的侦听器,我可以获得整个XML:

    class Program
    {
        static void Main(string[] args)
        {
            var listener = new TcpListener(IPAddress.Loopback, 9999);
            listener.Start();
            while (true)
            {
                var client = listener.AcceptTcpClient();
                using (var stream = client.GetStream())
                using (var reader = new StreamReader(stream))
                {
                    Console.WriteLine(reader.ReadToEnd());
                }
            }
        }
    }