У меня возникла проблема с потоковыми 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 линии.
Есть ли лучший способ здесь?