Navigation

Navigation

Aspose.Words FOSS для .NET включає невеликий Nodes.Navigation простір імен для ітерації та позиціонування у дереві вузлів документа: NodeEnumerator, тип-перелічувача, який стоїть за ітерацією у стилі for-each над дочірніми вузлами, і DocumentPositionMovement, перелік, що описує, як позиція одного вузла відноситься до іншого під час обходу. Це відрізняється від API маніпуляції деревом (вставка, видалення та реорганізація вузлів), розглянутих у Nodes сторінці — ця сторінка охоплює переміщення та порівняння позицій у вже існуючому дереві.


Ітерація дочірніх вузлів

Будь-який CompositeNode (базовий клас для контейнерних вузлів, таких як Document, Section, Body та Paragraph) підтримує ітерацію у стилі for-each над своїми безпосередніми дочірніми елементами через GetEnumerator(), який — згідно з його документацією — забезпечує підтримку ітерації у стилі for-each над дочірніми вузлами вузла. Повернутий перечислювач реалізує IEnumerator<Node>; у цьому API інтерфейсі ця роль виконує NodeEnumerator, який також реалізує IDocumentPositionListener, щоб відстежувати зміни позиції під час перебору підлеглого дерева. NodeEnumerator надає стандартні члени Dispose() і Reset() разом з контрактом IEnumerator<Node>.


Переміщення позиції документа

DocumentPositionMovement — це перелік з шести елементів — None, Inside, StartEnd, Sibling, Above та Below — що представляє, як одна позиція в документі відноситься до іншої під час навігації по дереву: чи вона незмінна, переміщена всередину вузла, переміщена до початкової/кінцевої межі, переміщена до сусіднього вузла, або переміщена вище чи нижче від опорної позиції. Вона визначена разом з NodeEnumerator у тому самому Nodes.Navigation розділі поверхні API, відображаючи її роль у відстеженні змін позиції під час перебору.


Поради та найкращі практики

  • Використовуйте стандартний C# foreach над будь-яким CompositeNode (або викликайте GetEnumerator() безпосередньо), щоб пройти негайні дочірні елементи вузла — енумератор обробляє контракт IEnumerator<Node> за вас.
  • Оскільки NodeEnumerator також реалізує IDocumentPositionListener, уникайте кешування енумератора під час структурних змін дерева; отримайте його знову через GetEnumerator(), якщо колекція вузлів, яку ви ітеруєте, змінилася.
  • Для глибоких проходжень дерева (не лише негайних дочірніх елементів) використовуйте Node.NextPreOrder(rootNode) / PreviousPreOrder(rootNode) або GetChildNodes(nodeType, isDeep) з isDeep, встановленим у true, замість ручного вкладення енумераторів.

Поширені проблеми

ПроблемаПричинаВиправлення
Перерахунок дочірніх елементів вузла під час їх модифікації викликає виключення або пропускає вузлиДерево було структурно змінено під час перерахункуСпочатку зберіть вузли в масив (наприклад за допомогою NodeCollection.ToArray()), потім ітеруйте масив, модифікуючи дерево
Не впевнено, як переміщена позиція співвідноситься з оригінальноюDocumentPositionMovement значення не були перевіреніПеревірте повідомлений DocumentPositionMovement (Inside, StartEnd, Sibling, Above, Below або None), замість того щоб припускати конкретний зв’язок

FAQ

Чи потрібно використовувати NodeEnumerator безпосередньо?

Зазвичай ні — стандартний C# foreach над CompositeNode використовує його неявно через GetEnumerator(). Звертайтеся до нього безпосередньо лише коли потрібен явний контроль над Dispose()/Reset().

Що описує DocumentPositionMovement?

Відношення між двома позиціями в дереві документа під час навігації — None, Inside, StartEnd, Sibling, Above або Below.

Чим це відрізняється від API маніпуляції деревом на сторінці Nodes?

The Nodes сторінка охоплює вставку, видалення, клонування та реорганізацію вузлів. Ця сторінка охоплює лише читальний обход і позиціонування в уже існуючому дереві.


API Reference Підсумок

Class / EnumОпис
NodeEnumeratorIEnumerator<Node> / IDocumentPositionListener реалізація під ітерацією for-each; Dispose(), Reset()
DocumentPositionMovementШестичленний enum, що описує відносну позицію під час обходу (None, Inside, StartEnd, Sibling, Above, Below)
CompositeNode.GetEnumerator()Повертає enumerator для безпосередніх дочірніх елементів вузла

Дивіться також

 Українська