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 摘要

类 / 枚举描述
NodeEnumeratorIEnumerator<Node> / IDocumentPositionListener 在 foreach 迭代背后的实现;Dispose(),Reset()
DocumentPositionMovement六成员枚举,描述遍历过程中的相对位置(None,Inside,StartEnd,Sibling,Above,Below)
CompositeNode.GetEnumerator()返回节点的直接子节点的枚举器

另请参阅

 中文