XmlReader: есть ли способ найти первого ребенка и следующего брата?

Я портирую код, использующий XmlDocument. XmlNode имеет свойства FirstChild и NextSibling. Есть ли способ синтаксического анализа с использованием XmlReader до первого дочернего элемента или следующего брата, если xmlreader проанализировал произвольный элемент в xml?


person Jacko    schedule 11.11.2011    source источник


Ответы (2)


С XmlRreader вы работаете по другой схеме. Вы всегда находитесь на каком-то текущем узле и переключаетесь на следующий. Для текущего узла вы можете спросить IsEmptyElement (который говорит, имеет ли тег форму <something attr=value/>. Если элемент пуст, очевидно, у вас нет дочерних элементов.

Рассмотрим случай, когда IsEmptyElement ложно, теперь у вас есть что-то вроде <something> <maybechild/> </something>. Вы можете сказать ReadStartElement, что переведет вас на следующую позицию. Для следующей позиции вы проверяете IsStartElement. Если это правда, у вас есть ребенок, и вы этим занимаетесь. В противном случае вы находитесь в </something> и детей нет.

Еще немного документации: http://msdn.microsoft.com/en-us/library/t9bfea29.aspx.

person Vlad    schedule 11.11.2011
comment
Прохладный. Спасибо Влад. RTFM для меня :) - person Jacko; 12.11.2011
comment
@Jacko: ну, вы перейдете к братьям и сестрам после того, как закончите с самим элементом. Если элемент пуст (IsEmptyElement истинно), после перехода к следующему элементу у вас будет либо IsStartElement == true (тогда у вас есть брат), либо false (тогда у вас есть конец родительского элемента). Если элемент не пустой, вы читаете дочерние элементы и закрывающий тег, переходите к следующему и обрабатываете таким же образом. - person Vlad; 12.11.2011

Создайте XPathDocument и создайте XPathNavigator, используя CreateNavigator. У него есть методы (как следует из названия) для навигации по XML. Эквивалентные методы - MoveToFirstChild и MoveToNext.

person Marc L.    schedule 11.11.2011
comment
Спасибо, Марк. Я использую XmlReader, чтобы избежать накладных расходов на память и производительность. Я подумывал об использовании свойства глубины для определения дочерних элементов или братьев и сестер. - person Jacko; 12.11.2011