Navigation
Navigation
Aspose.Words .NET 用の FOSS には小さな Nodes.Navigation ドキュメントのノードツリー内で反復と位置決めを行うための名前空間: NodeEnumerator, 子ノードに対する foreach スタイルの反復を支える列挙子型、そして DocumentPositionMovement, 走査中にあるノードの位置が別のノードとどのように関係するかを示す列挙です。これは、ツリーマニピュレーション API(ノードの挿入、削除、再配置)とは別で、 Nodes ページです — このページでは、既に存在するツリー内での移動と位置の比較について扱います。
子ノードの反復
任意の CompositeNode(Document、Section、Body、Paragraph などのコンテナノードの基底クラス)は、GetEnumerator() を介して直接の子要素に対する for-each スタイルの反復をサポートします。GetEnumerator() は、ドキュメントに記載されているとおり、ノードの子ノードに対する for-each スタイルの反復を提供します。返される列挙子は IEnumerator<Node> を実装しています。この API の表層では、その役割は NodeEnumerator が担い、NodeEnumerator は IDocumentPositionListener も実装しているため、基礎となるツリーが列挙されている間に位置変更を追跡できます。NodeEnumerator は標準の Dispose() と Reset() メンバーを、IEnumerator<Node> 契約と共に公開します。
ドキュメント位置の移動
DocumentPositionMovement は 6 つのメンバー — None、Inside、StartEnd、Sibling、Above、Below — を持つ列挙型で、ツリーをナビゲートする際に文書内のある位置が別の位置とどのように関係するか(変更なし、ノード内部へ移動、開始/終了境界へ移動、兄弟ノードへ移動、参照位置の上または下へ移動)を表します。これは NodeEnumerator と同じ Nodes.Navigation 領域内で API の表層に定義されており、列挙中の位置変化の追跡における役割を反映しています。
ヒントとベストプラクティス
- 任意の
CompositeNode上で標準的なC#foreachを使用する(またはGetEnumerator()を直接呼び出す)ことで、ノードの直接の子を走査します — 列挙子がIEnumerator<Node>契約を自動的に処理します。 NodeEnumeratorはIDocumentPositionListenerも実装しているため、ツリーの構造変更に跨って列挙子をキャッシュしないでください;反復中のノードコレクションが変更された場合はGetEnumerator()を通じて再取得してください。- 深いツリー走査(直接の子だけでなく)には、
Node.NextPreOrder(rootNode)/PreviousPreOrder(rootNode)を使用するか、isDeepをtrueに設定したGetChildNodes(nodeType, isDeep)を使用し、手動で列挙子を入れ子にしないでください。
一般的な問題
| 問題 | 原因 | 修正 |
|---|---|---|
| ノードの子要素を列挙しながらそれらを変更すると、例外が発生したりノードがスキップされたりします | 列挙中にツリーの構造が変更されました | まずノードを配列に集めます(例: NodeCollection.ToArray() を使用)、その後ツリーを変更しながら配列を反復処理します |
| 移動した位置が元の位置とどのように関係するか不明です | DocumentPositionMovement の値は検査されませんでした | 特定の関係を仮定するのではなく、報告された DocumentPositionMovement(Inside、StartEnd、Sibling、Above、Below、または None)を確認してください |
FAQ
NodeEnumerator を直接使用する必要がありますか?
通常は必要ありません — CompositeNode 上の標準的なC#foreachは GetEnumerator() を介して暗黙的に使用されます。Dispose()/Reset() を明示的に制御する必要がある場合にのみ、直接使用してください。
DocumentPositionMovement は何を記述していますか?
ナビゲーション中のドキュメントツリー内の二つの位置間の関係 — None, Inside, StartEnd, Sibling, Above, または Below。
Nodes ページのツリーマニピュレーション API とどのように異なりますか?
その Nodes このページでは、ノードの挿入、削除、クローン作成、再編成について説明します。このページは、既に存在するツリー内での読み取り専用の走査と位置決めについて扱います.
API Reference 概要
| クラス / 列挙型 | 説明 |
|---|---|
NodeEnumerator | IEnumerator<Node> / IDocumentPositionListener 実装は for-each 反復の背後にあります; Dispose(), Reset() |
DocumentPositionMovement | 走査中の相対位置を表す 6 要素の列挙型(None, Inside, StartEnd, Sibling, Above, Below) |
CompositeNode.GetEnumerator() | ノードの直接子の列挙子を返します |