Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Общие вопросы по .NET и C# > Как с помощью XmlTextReader перейти к...


Автор: CyraxZ 18.1.2007, 20:49
У объекта класса XmlTextReader есть метод ReadToNextSibling(string), здесь нужно указать имя sibling-элемента, к которому нужно перейти.
Мне нужно перейти к следующемуsibling-элементу (какое-бы имя он не имел), не заходя внутрь текущего элемента...
Можно ли это сделать с помощью XmlReader'ов (т.е. используя SAX-интерфейс) или без DOM-модели не обойтись ?

Автор: mr.DUDA 18.1.2007, 23:21
ИМХО, нет.
Последовательный читатель не может пропустить ни одного элемента XML-документа.

Автор: CyraxZ 19.1.2007, 10:04
Вопрос не верно понят !!!
Пусть методы последовательно читают все элементы, главное, чтобы метод вернул объект XmlReader, указывающий на следующий sibling-элемент (относительно текущего элемента).

Пример:

<elem_1>
</elem_1>

<elem_2>
  <elem_2>
  </elem_2>
</elem_2>

<elem_3>
</elem_3>

Текущая позиция - внешний <elem_2>. Мне нужно получить XmlReader, указывающий на <elem_3>. Имя элемента <elem_3> неизвестно. Известно лишь, что он является следующим братом для внешнего <elem_>2

Для использования метода ReadToNextSibling(string) нужно знать имя брата, в данном случае имя брата неизвестно.
А метода ReadToNextSibling() нет...

Автор: CyraxZ 21.1.2007, 20:44
Складывается впечатление, что с XmlReader'ами никто не работал...
Мне всего-навсего нужно перейти на элемент-брата, т.е. что-то вроде ReadToNextSibling, но без указания имени этого брата...

Если здраво рассуждать, то в первую очередь должен был быть реализован метод ReadToNextSibling(), а уже потом - ReadToNextSibling(string)...

Автор: mr.DUDA 21.1.2007, 23:01
Что реализовано в FCL, то реализовано. Если нельзя быстро перейти к следующему сиблингу (без зачитки всего документа), значит нельзя. Хотя, кажется мне, слабовато вы копали в мсдн - такая функциональность просто обязана присутствовать  smile ...

Автор: CyraxZ 22.1.2007, 22:53
Всё, нашёл - Skip() - пропускает все дочерние узлы.
Собственно, GoToNextSibling() и есть...

Автор: CyraxZ 24.1.2007, 23:19
Поправляюсь: похож на GoToNextSibling(), когда указатель находится на узле-элементе (в терминах System.Xml).
Только плохо, что при отсутствии sibling-элемента, когда Skip() перемещает указатель на узел-элемент уровня выше, чем имеют перебираемые узлы-элементы (с внутреннего <elem_2> Skip() перемещает нас на <elem_3>), приходится проверять Depth, т.к. Skip() возвращает void...

Гораздо удобнее было бы, если (наряду со Skip'ом) был бы реализован метод GoToNextSibling без параметров, возвращающий false, если следующего брата нет...
Собственно, из таких соображений смею заявить, что это очередная недоработка C#, а вернее классов из System.Xml...

Автор: Naum 25.1.2007, 10:38
 smile Ну начнем с того, что в 1.1 Framework вообще нет метода GoToNextSibling() (имеется в ввиду метод GoToNextSibling(string)) smile. А вообще (это только мое личное мнение) мне все чаще кажется, что многие недоработки  мелкомягких не случайные. Во-первых, можно быстрее выпустить текущую версию продукта. Во-вторых, будет легче продавать следующую версию продукта, в которой эти недоработки будут исправлены.

Автор: CyraxZ 25.1.2007, 10:48
В Framework 2.0 тоже нет метода GoToNextSibling()...

Автор: mr.DUDA 25.1.2007, 13:38

M
mr.DUDA
Ругать мелкомягких давайте будем во флеймовом разделе, или добро пожаловать в Религиозные войны

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)