XmlDocument.Save пропускает элементы

У меня есть следующий XML, созданный во время выполнения с использованием 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?


person Ian Kemp    schedule 20.11.2009    source источник


Ответы (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());
            }
        }
    }
}
person Darin Dimitrov    schedule 20.11.2009