XmlDocument.Save省略元素

时间:2009-11-20 12:25:34

标签: c# .net-3.5 stream xmldocument io

我有以下使用XmlDocument

在运行时构建的XML
<?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 个答案:

答案 0 :(得分:1)

两种发送数据的方式都没有错。你在服务器端读取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());
            }
        }
    }
}