Читать XElement из XmlReader - PullRequest
       19

Читать XElement из XmlReader

8 голосов
/ 15 ноября 2010

Я играю с парсингом потока XML XMPP.Сложность XML-потока заключается в том, что начальный тег не закрывается до конца сеанса, т. Е. Никогда не будет получен полный DOM.

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

Мне нужно прочитать элементы XML из потокане заботясь о том, что корневой элемент не был закрыт.

В идеале это будет работать, но это не так, и я предполагаю, что это потому, что читатель ожидает закрытия корневого элемента.

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

Приведенный ниже код (который я позаимствовал у Джейкоба Реймерса ) работает, но я надеюсь, что есть более эффективный способ, который не предусматривает создание нового XmlReader и анализ строки.

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

1 Ответ

11 голосов
/ 15 ноября 2010

Вам не нужно работать со строками;вы должны иметь возможность использовать XElement.Load на поддереве:

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

И обратите внимание, что это не совсем "новый" xml-ридерон сильно привязан к внешнему считывателю (но ограничен набором узлов).

...