XmlWriter оставить элемент открытым - PullRequest
1 голос
/ 21 марта 2012

Я смотрю на протокол 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 - это то, что объясняется в этой записи

1 Ответ

0 голосов
/ 21 марта 2012

Вероятно, вам следует рассмотреть одну из существующих библиотек, на которые ссылается xmpp.org . Обработка объявлений пространства имен как атрибутов вернется к вам позже.

Что касается вашего вопроса, вручную сериализуйте начальный тег stream:stream и используйте XmlWriter только для полных строф.

...