Как прочитать полный XML-элемент с его дочерними элементами при получении данных из NetworkStream?

Код, который у меня есть до сих пор, выглядит так.

using (XmlReader r = XmlReader.Create(stream, new XmlReaderSettings() { Async = true }))
{                    
    while (await r.ReadAsync())
    {
        switch (r.NodeType) {
            case XmlNodeType.Element:
                if (r.IsEmptyElement) // no attributes
                {
                    OnReceive("<" + r.Name + " />");
                }
                else // has attributes
                {
                    OnReceive("<" + r.Name + ">");
                    while (r.MoveToNextAttribute())
                    {
                        OnReceive(r.Name + " -> " + r.Value);
                    }
                }                                
                break;
        }
    }
}

Мой XML выглядит следующим образом.

<?xml version='1.0' encoding='UTF-8'?>
<start>
    <a>
        <b></b>
        <c>
            <d>TEXT01</d>
            <d>TEXT01</d>
            <d>TEXT01</d>
            <d>TEXT01</d>
        </c>
        <e>
            <f>TEST01</f>
        </e>
        <g/>
        <h/>
    </a>
...

Как только я нажму элемент XML <a>, я хотел бы прочитать его до конца (пока я не нажму </a>), а затем запустить событие со всем элементом и его дочерними элементами.

Как мне это сделать? Есть ли какой-то механизм, который позволяет мне читать поток таким образом (дождитесь конца элемента), а затем продолжить работу с другими частями XML?


person Tony Stark    schedule 14.08.2013    source источник


Ответы (1)


Ну, это, вероятно, выполнимо с ReadInnerXmlAsync.

switch (r.NodeType) {
                            case XmlNodeType.Element:
                                if (r.Name.Equals("a"))
                                {
                                    string x = await r.ReadInnerXmlAsync();
                                    OnReceive(x);
                                }                               
                                break;
                        }
person Tony Stark    schedule 14.08.2013
comment
Наверное? Ты хочешь сказать, что даже не пробовал? - person svick; 14.08.2013
comment
Я сделал. Однако я сталкиваюсь с другими проблемами, которые описаны в stackoverflow.com/questions/18231945/. Поэтому я и пишу: возможно. Теперь я знаю: это, вероятно, не тот путь. - person Tony Stark; 14.08.2013