2015-03-20 4 views
0

У меня возникла проблема с потоковыми XElements и когда нет пробелов.потоковая передача событий XElements, когда нет пробелов

Учитывая следующий код из MSDN документации о потоковой XElements,

public static IEnumerable<XElement> StreamElements(Stream source, string elementName) 
    { 
     using (XmlReader reader = XmlReader.Create(source)) 
     { 
      XElement item = null; 

      reader.MoveToContent(); 

      // Parse the file, save header information when encountered, and yield the 
      // Item XElement objects as they are created. 

      // loop through codeFile elements 
      while (reader.Read()) 
      { 
       if (reader.NodeType == XmlNodeType.Element && reader.Name == elementName) 
       { 
        item = XElement.ReadFrom(reader) as XElement; 

        if (item != null) 
        { 
         yield return item; 
        } 
       } 
      } 
     } 
    } 

Этот код не выполняется, когда элементы не имеют никаких пробелов между ними, так как метод XElement.ReadFrom перемещает текущую позицию мимо узла EndElement. Когда есть пробелы, читатель находится на узле Text, и код работает нормально. Но когда нет пробелов, читатель находится на следующем узле Element, а линия while (reader.Read()) проходит мимо узла элемента, и вы фактически теперь пропускаете каждый другой узел.

Проблема была «решена», пропуская строку while (reader.Read()), когда вернется правильный элемент, т.е. добавьте метку «readnext:» в первую строку цикла while и добавьте «goto readnext» ;» сразу после возвращения выхода:

  // loop through codeFile elements 
      while (reader.Read()) 
      { 
       readnext: 
       if (reader.NodeType == XmlNodeType.Element && reader.Name == elementName) 
       { 

        item = XElement.ReadFrom(reader) as XElement; 

        if (item != null) 
        { 
         yield return item; 
         goto readnext; 
        } 
       } 
      } 

Обратите внимание, что я попытался XmlReaderSettings с IgnoreWhitespace = правда на XmlReader.Create линии.

Есть ли лучший способ здесь?

ответ

0

Да не использовать goto

reader.Read(); 
while (!reader.EOF) 
{ 
    if (reader.NodeType == XmlNodeType.Element && reader.Name == elementName) 
    { 
     item = XElement.ReadFrom(reader) as XElement; 

     if (item != null) 
     { 
      yield return item; 
     } 
    } 
    else 
    { 
     reader.Read(); 
    } 
} 
Смежные вопросы