代码之家  ›  专栏  ›  技术社区  ›  sipsorcery

从XmlReader读取XElement

  •  8
  • sipsorcery  · 技术社区  · 15 年前

    我正在分析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 回复  |  直到 15 年前
        1
  •  11
  •   Marc Gravell    15 年前

    你不应该用绳子工作;你 应该 能够使用 XElement.Load 在子树上:

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

    注意,这并不是一个真正的“新”xml阅读器——它与外部阅读器紧密相连(但受一组节点的限制)。