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#
foreachchuẩn trên bất kỳCompositeNodenào (hoặc gọiGetEnumerator()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 đồngIEnumerator<Node>cho bạn. - Vì
NodeEnumeratorcũng triển khaiIDocumentPositionListener, 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ó quaGetEnumerator()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ặcGetChildNodes(nodeType, isDeep)vớiisDeepđược đặt thànhtrue, 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ân | Sử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út | Câ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ốc | Các giá trị DocumentPositionMovement đã không được kiểm tra | Kiể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 / Enum | Mô tả |
|---|---|
NodeEnumerator | IEnumerator<Node> / IDocumentPositionListener triển khai phía sau vòng lặp for-each; Dispose(), Reset() |
DocumentPositionMovement | Enum 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 |