Я смотрю на протокол XMPP и тестирую некоторые базовые взаимодействия с сервером.XMPP взаимодействует, обмениваясь XML вперед и назад, но этот XML является частью непрерывного потока, эффективно создавая документ по мере его продвижения.
Я попытался воспроизвести это с помощью XmlWriter, и хотя я могу почти полностью создать Xmlточно так, как требуется, я не могу помешать автору закрыть элемент XML.Например, чтобы открыть соединение, вы отправляете элемент <stream:stream ... >
(который будет закрыт на более позднем этапе взаимодействия).Использование XmlWriter всегда закрывает этот элемент, такой как: <stream:stream ... />
, который я не хочу, потому что отправка закрытия />
заставит сервер закрыть поток.
Есть ли способ получить XmlWriterоставить элемент «открытым», но все же получить данные, содержащиеся в?Конечно, я могу просто заменить строку на элементе, чтобы избавиться от '/', но я бы предпочел найти более удобный способ сделать это, если это возможно.
Исходное сообщение для отправки на сервервыглядит так: <?xml version="1.0" encoding="utf-8"?><stream:stream from="email@address.com" to="address.com" version="1.0" xml:lang="en" xmlns="jabber:client" xmlns:stream="http://etherx.jabber.org/streams" >
Пока мой код:
private string CreateStreamHeader(string from, string to, double version)
{
Encoding encoding = new UTF8Encoding(false);
var sb = new StringBuilder();
var settings = new XmlWriterSettings();
settings.Encoding = encoding;
using(var output = new StringWriterWithEncoding(sb, encoding))
{
using(XmlWriter writer = XmlWriter.Create(output, settings))
{
writer.WriteStartDocument();
writer.WriteStartElement("stream", "stream", "http://etherx.jabber.org/streams");
writer.WriteAttributeString("from", from);
writer.WriteAttributeString("to", to);
writer.WriteAttributeString("version", version.ToString("0.0"));
writer.WriteAttributeString("xml", "lang", null, "en");
writer.WriteAttributeString("xmlns", "jabber:client");
}
}
return sb.ToString();
}
И этот код выдает: <?xml version="1.0" encoding="utf-8"?><stream:stream from="email@address.com" to="address.com" version="1.0" xml:lang="en" xmlns="jabber:client" xmlns:stream="http://etherx.jabber.org/streams" />
<- обратите внимание на /> здесь
Примечание: StringWriterWithEncoding - это то, что объясняется в этой записи