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