【问题标题】:Read XElement from XmlReader从 XmlReader 读取 XElement
【发布时间】:2011-05-10 05:03:17
【问题描述】:

我正在尝试解析 XMPP XML 流。 XML 流的棘手之处在于开始标签直到会话结束才会关闭,即永远不会收到完整的 DOM。

<stream:stream>
    <features>
       <starttls />
    </features>
    ....
    network session persists for arbitrary time
    ....
 </stream:stream>

我需要从流中读取 XML 元素,而不关心根元素是否已关闭。

理想情况下这会起作用,但它不起作用,我假设这是因为阅读器正在等待关闭根元素。

XElement someElement = XNode.ReadFrom(xmlReader) as XElement;

下面的代码(我从 Jacob Reimers 借来的)确实有效,但我希望有一种更有效的方法,不涉及创建新的 XmlReader 和进行字符串解析。

 XmlReader stanzaReader = xmlReader.ReadSubtree();
 stanzaReader.MoveToContent();
 string outerStanza = stanzaReader.ReadOuterXml();
 stanzaReader.Close();
 XElement someElement = XElement.Parse(outerStanza);

【问题讨论】:

    标签: .net xmpp xmlreader


    【解决方案1】:

    您不需要使用字符串;您应该能够在子树上使用XElement.Load

    XElement someElement;
    using(XmlReader stanzaReader = xmlReader.ReadSubtree()) {
        someElement = XElement.Load(stanzaReader);
    }
    

    请注意,这并不是真正的“新”xml 阅读器——它与外部阅读器密切相关(但仅限于一组节点)。

    【讨论】:

    • 鉴于你的例子,我不明白为什么 XmlReader stanzaReader = XElement.Load(xmlReader.ReadSubtree()) 不能完成这项工作。我仍然将 xmlReader 放在 using 块中,它会负责任何清理工作。
    • @sipwiz - 在这种特殊情况下,您可能会侥幸逃脱;我只是根深蒂固:立即处理 every IDisposablestanzaReader 最终是一个不同的对象。
    • .net 的拉解析器的早期版本会一次等待 4kB 来缓冲。这就是我最终将 James Clark 的 XP 解析器从 Java 移植到 Jabber-net 的 C# 的原因。
    猜你喜欢
    • 1970-01-01
    • 2012-10-05
    • 2013-04-17
    • 2018-05-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-05-31
    相关资源
    最近更新 更多