Navigation

Navigation

Aspose.Words FOSS cho .NET bao gồm một phần nhỏ Nodes.Navigation không gian tên để lặp và định vị trong cây nút của tài liệu: NodeEnumerator, kiểu enumerator đứng sau việc lặp kiểu for-each trên các nút con, và DocumentPositionMovement, một enumeration mô tả cách vị trí của một nút liên quan đến nút khác trong quá trình duyệt. Điều này khác với các API thao tác cây (chèn, xóa và sắp xếp lại các nút) được đề cập trên Nodes trang — trang này đề cập đến việc di chuyển và so sánh vị trí trong một cây đã tồn tại.


Lặp qua các nút con

Bất kỳ CompositeNode nào (lớp cơ sở cho các nút chứa như Document, Section, Body, và Paragraph) đều hỗ trợ việc lặp kiểu for-each trên các con trực tiếp của nó thông qua GetEnumerator(), mà — theo tài liệu của nó — cung cấp hỗ trợ cho kiểu lặp for-each trên các nút con của một nút. Enumerator được trả về triển khai IEnumerator<Node>; trong giao diện API này, vai trò đó được thực hiện bởi NodeEnumerator, cũng triển khai IDocumentPositionListener để có thể theo dõi các thay đổi vị trí trong khi cây nền được liệt kê. NodeEnumerator phơi bày các thành viên tiêu chuẩn Dispose() và Reset() cùng với hợp đồng IEnumerator<Node>.


Di chuyển vị trí tài liệu

DocumentPositionMovement là một enumeration với sáu thành viên — None, Inside, StartEnd, Sibling, Above, và Below — mô tả cách một vị trí trong tài liệu liên quan đến vị trí khác khi cây được duyệt: liệu nó không thay đổi, di chuyển vào bên trong một nút, di chuyển đến ranh giới bắt đầu/kết thúc, di chuyển đến một nút anh/chị, hoặc di chuyển lên trên hoặc xuống dưới vị trí tham chiếu. Nó được định nghĩa cùng với NodeEnumerator trong cùng khu vực Nodes.Navigation của giao diện API, phản ánh vai trò của nó trong việc theo dõi các thay đổi vị trí trong quá trình liệt kê.


Mẹo và Thực hành tốt nhất

  • Sử dụng một C# foreach chuẩn trên bất kỳ CompositeNode nào (hoặc gọi GetEnumerator() trực tiếp) để duyệt các con trực tiếp của một nút — bộ liệt kê sẽ xử lý hợp đồng IEnumerator<Node> cho bạn.
  • Vì NodeEnumerator cũng triển khai IDocumentPositionListener, tránh lưu bộ liệt kê trong bộ nhớ đệm qua các chỉnh sửa cấu trúc của cây; hãy lấy lại nó qua GetEnumerator() nếu bộ sưu tập nút mà bạn đang lặp đã thay đổi.
  • Đối với việc duyệt cây sâu (không chỉ các con trực tiếp), hãy sử dụng Node.NextPreOrder(rootNode) / PreviousPreOrder(rootNode), hoặc GetChildNodes(nodeType, isDeep) với isDeep được đặt thành true, thay vì lồng các bộ liệt kê một cách thủ công.

Các vấn đề thường gặp

Vấn đềNguyên nhânSửa lỗi
Việc liệt kê các nút con của một nút trong khi sửa đổi chúng gây ra lỗi hoặc bỏ qua các nútCây đã bị thay đổi cấu trúc trong quá trình liệt kêĐầu tiên thu thập các nút vào một mảng (ví dụ bằng NodeCollection.ToArray()), sau đó duyệt mảng trong khi sửa đổi cây
Không chắc vị trí đã di chuyển liên quan như thế nào tới vị trí gốcCác giá trị DocumentPositionMovement đã không được kiểm traKiểm tra DocumentPositionMovement đã báo cáo (Inside, StartEnd, Sibling, Above, Below hoặc None) thay vì giả định một mối quan hệ cụ thể

FAQ

Tôi có cần sử dụng NodeEnumerator trực tiếp không?

Không thường xuyên — C# foreach chuẩn trên một CompositeNode sử dụng nó một cách ngầm qua GetEnumerator(). Chỉ nên truy cập trực tiếp khi bạn cần kiểm soát rõ ràng đối với Dispose()/Reset().

DocumentPositionMovement mô tả gì?

Mối quan hệ giữa hai vị trí trong cây tài liệu khi điều hướng — None, Inside, StartEnd, Sibling, Above, hoặc Below.

Điều này khác gì so với các API thao tác cây trên trang Nodes?

Cái Nodes trang bao gồm việc chèn, xóa, sao chép và tái tổ chức các nút. Trang này bao gồm việc duyệt chỉ đọc và định vị trong một cây đã tồn tại.


API Reference Tóm tắt

Lớp / EnumMô tả
NodeEnumeratorIEnumerator<Node> / IDocumentPositionListener triển khai phía sau vòng lặp for-each; Dispose(), Reset()
DocumentPositionMovementEnum sáu thành viên mô tả vị trí tương đối trong quá trình duyệt (None, Inside, StartEnd, Sibling, Above, Below)
CompositeNode.GetEnumerator()Trả về enumerator cho các nút con trực tiếp của một node

Xem thêm

 Tiếng Việt