Navigation
Navigation
Aspose.Words FOSS untuk .NET menyertakan sebuah kecil Nodes.Navigation namespace untuk iterasi dan penempatan dalam pohon node dokumen: NodeEnumerator, tipe enumerator di balik iterasi gaya for-each atas node anak, dan DocumentPositionMovement, sebuah enumerasi yang menjelaskan bagaimana posisi satu node berhubungan dengan node lain selama penelusuran. Ini berbeda dari API manipulasi pohon (menyisipkan, menghapus, dan mengatur ulang node) yang dibahas pada Nodes halaman — halaman ini membahas pergerakan dan perbandingan posisi dalam pohon yang sudah ada.
Mengiterasi Node Anak
Setiap CompositeNode (kelas dasar untuk node kontainer seperti Document, Section, Body, dan Paragraph) mendukung iterasi gaya for-each atas anak langsungnya melalui GetEnumerator(), yang — menurut dokumentasinya — menyediakan dukungan untuk gaya iterasi for-each atas node anak dari sebuah node. Enumerator yang dikembalikan mengimplementasikan IEnumerator<Node>; dalam permukaan API ini, peran tersebut diisi oleh NodeEnumerator, yang juga mengimplementasikan IDocumentPositionListener sehingga dapat melacak perubahan posisi saat pohon yang mendasarinya sedang di-enumerasi. NodeEnumerator mengekspos anggota standar Dispose() dan Reset() bersama dengan kontrak IEnumerator<Node>.
Pergerakan Posisi Dokumen
DocumentPositionMovement adalah sebuah enumerasi dengan enam anggota — None, Inside, StartEnd, Sibling, Above, dan Below — yang mewakili bagaimana satu posisi dalam dokumen berhubungan dengan posisi lain saat pohon dinavigasi: apakah tidak berubah, dipindahkan ke dalam sebuah node, dipindahkan ke batas awal/akhir, dipindahkan ke saudara, atau dipindahkan di atas atau di bawah posisi referensi. Ini didefinisikan bersama NodeEnumerator dalam area Nodes.Navigation yang sama pada permukaan API, mencerminkan perannya dalam melacak perubahan posisi selama enumerasi.
Tips dan Praktik Terbaik
- Gunakan C#
foreachstandar pada setiapCompositeNode(atau panggilGetEnumerator()secara langsung) untuk menjelajahi anak langsung sebuah node — enumerator menangani kontrakIEnumerator<Node>untuk Anda. - Karena
NodeEnumeratorjuga mengimplementasikanIDocumentPositionListener, hindari menyimpan enumerator di cache saat melakukan perubahan struktural pada pohon; dapatkan kembali melaluiGetEnumerator()jika koleksi node yang Anda iterasi telah berubah. - Untuk penelusuran pohon yang dalam (bukan hanya anak langsung), gunakan
Node.NextPreOrder(rootNode)/PreviousPreOrder(rootNode), atauGetChildNodes(nodeType, isDeep)denganisDeepdiatur ketrue, alih-alih menumpuk enumerator secara manual.
Masalah Umum
| Masalah | Penyebab | Perbaikan |
|---|---|---|
| Enumerasi anak node sambil memodifikasinya dapat melempar atau melewatkan node | Pohon diubah secara struktural selama enumerasi | Kumpulkan node ke dalam array terlebih dahulu (misalnya dengan NodeCollection.ToArray()), kemudian iterasi array sambil memodifikasi pohon |
| Tidak yakin bagaimana posisi yang dipindahkan berhubungan dengan posisi asli | Nilai DocumentPositionMovement tidak diperiksa | Periksa DocumentPositionMovement yang dilaporkan (Inside, StartEnd, Sibling, Above, Below, atau None) alih-alih mengasumsikan hubungan tertentu |
FAQ
Apakah saya perlu menggunakan NodeEnumerator secara langsung?
Tidak biasanya — C# foreach standar pada sebuah CompositeNode menggunakannya secara implisit melalui GetEnumerator(). Gunakan secara langsung hanya ketika Anda memerlukan kontrol eksplisit atas Dispose()/Reset().
Apa yang DocumentPositionMovement jelaskan?
Hubungan antara dua posisi dalam pohon dokumen selama navigasi — None, Inside, StartEnd, Sibling, Above, atau Below.
Bagaimana ini berbeda dari API manipulasi pohon pada halaman Nodes?
The Nodes halaman mencakup penyisipan, penghapusan, pengkloningan, dan reorganisasi node. Halaman ini mencakup traversasi read-only dan penempatan dalam pohon yang sudah ada.
API Reference Ringkasan
| Kelas / Enum | Deskripsi |
|---|---|
NodeEnumerator | IEnumerator<Node> / IDocumentPositionListener implementasi di belakang iterasi for-each; Dispose(), Reset() |
DocumentPositionMovement | Enum enam anggota yang menggambarkan posisi relatif selama penelusuran (None, Inside, StartEnd, Sibling, Above, Below) |
CompositeNode.GetEnumerator() | Mengembalikan enumerator untuk anak langsung sebuah node |