XmlWriter保持元素打开

本文关键字:元素 XmlWriter | 更新日期: 2023-09-27 18:28:33

我正在研究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就是在这篇文章

XmlWriter保持元素打开

中解释的

您可能应该考虑在xmpp.org上链接到的现有库之一。将命名空间声明视为属性会在以后困扰您。

至于您的问题,请手动序列化stream:stream开始标记,并且只对完整的节使用XmlWriter。