从XmlReader中读取XElement

时间:2010-11-15 12:13:46

标签: .net xmpp xmlreader

我正在解析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);

1 个答案:

答案 0 :(得分:11)

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

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

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