Navigation
Navigation
Aspose.Words FOSS for .NET 包含一个小 Nodes.Navigation 用于在文档节点树中迭代和定位的命名空间: NodeEnumerator, 对子节点进行 foreach 样式迭代的枚举器类型,以及 DocumentPositionMovement, 一个枚举,描述在遍历过程中一个节点的位置如何相对于另一个节点。这与在该页面中已覆盖的树操作 API(插入、删除和重新组织节点)不同。 Nodes 页面 — 本页介绍在已存在的树中移动和比较位置。
迭代子节点
任何 CompositeNode(容器节点的基类,例如 Document、Section、Body 和 Paragraph)都支持通过 GetEnumerator() 对其直接子节点进行 foreach 式迭代,根据其文档,它提供对节点子节点的 foreach 迭代的支持。返回的枚举器实现了 IEnumerator<Node>;在此 API 表面上,这一角色由 NodeEnumerator 承担,它同样实现了 IDocumentPositionListener,以便在枚举底层树时跟踪位置变化。NodeEnumerator 暴露了标准的 Dispose() 和 Reset() 成员以及 IEnumerator<Node> 合约。
文档位置移动
DocumentPositionMovement 是一个包含六个成员的枚举——None、Inside、StartEnd、Sibling、Above 和 Below——表示在遍历树时文档中一个位置相对于另一个位置的关系:位置保持不变、移动到节点内部、移动到开始/结束边界、移动到兄弟节点,或移动到参考位置的上方或下方。它与 NodeEnumerator 一起在 API 表面的同一 Nodes.Navigation 区域中定义,体现了其在枚举期间追踪位置变化的作用。
提示和最佳实践
- 在任何
CompositeNode上使用标准的C#foreach(或直接调用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吗?
通常不需要——在CompositeNode上使用标准的C#foreach会通过GetEnumerator()隐式使用它。只有在需要对Dispose()/Reset()进行显式控制时才直接使用它。
DocumentPositionMovement描述了什么?
在文档树导航期间,两个位置之间的关系 — None、Inside、StartEnd、Sibling、Above或Below。
这与 Nodes 页面上的树操作 API 有何不同?
该 Nodes 页面涵盖插入、删除、克隆和重新组织节点。本页涵盖对已有树的只读遍历和定位。
API Reference 摘要
| 类 / 枚举 | 描述 |
|---|---|
NodeEnumerator | IEnumerator<Node> / IDocumentPositionListener 在 foreach 迭代背后的实现;Dispose(),Reset() |
DocumentPositionMovement | 六成员枚举,描述遍历过程中的相对位置(None,Inside,StartEnd,Sibling,Above,Below) |
CompositeNode.GetEnumerator() | 返回节点的直接子节点的枚举器 |