Navigation
Navigation
Aspose.Words FOSS για .NET περιλαμβάνει ένα μικρό Nodes.Navigation χώρο ονομάτων για επανάληψη και τοποθέτηση εντός του δέντρου κόμβων ενός εγγράφου: NodeEnumerator, ο τύπος enumerator που βρίσκεται πίσω από την επανάληψη τύπου for-each πάνω σε θυγατρικούς κόμβους, και DocumentPositionMovement, μια απαρίθμηση που περιγράφει πώς η θέση ενός κόμβου σχετίζεται με αυτήν ενός άλλου κατά την περιήγηση. Αυτό διαφέρει από τα tree-manipulation APIs (inserting, removing, and reorganizing nodes) που καλύπτονται στο Nodes σελίδα — αυτή η σελίδα καλύπτει τη μετακίνηση και τη σύγκριση θέσεων σε ένα δέντρο που ήδη υπάρχει.
Επανάληψη Παιδικών Κόμβων
Οποιοδήποτε CompositeNode (η βασική κλάση για κόμβους δοχείων όπως Document, Section, Body και Paragraph) υποστηρίζει επανάληψη τύπου for-each στα άμεσα παιδιά του μέσω GetEnumerator(), που — σύμφωνα με την τεκμηρίωσή του — παρέχει υποστήριξη για την επανάληψη τύπου for-each στα παιδικά κόμβους ενός κόμβου. Ο επιστρεφόμενος enumerator υλοποιεί το IEnumerator<Node>; σε αυτή την επιφάνεια API, αυτός ο ρόλος αναλαμβάνεται από το NodeEnumerator, που επίσης υλοποιεί το IDocumentPositionListener ώστε να μπορεί να παρακολουθεί τις αλλαγές θέσης ενώ το υποκείμενο δέντρο γίνεται enumeration. Το NodeEnumerator εκθέτει τα τυπικά μέλη Dispose() και Reset() μαζί με τη σύμβαση IEnumerator<Node>.
Κίνηση Θέσης Εγγράφου
DocumentPositionMovement είναι μια enumeration με έξι μέλη — None, Inside, StartEnd, Sibling, Above και Below — που αντιπροσωπεύουν πώς μια θέση στο έγγραφο σχετίζεται με άλλη καθώς το δέντρο πλοηγορείται: είτε παραμένει αμετάβλητη, μετακινείται μέσα σε έναν κόμβο, μετακινείται σε όριο έναρξης/τέλους, μετακινείται σε αδερφό κόμβο, ή μετακινείται πάνω ή κάτω από τη θέση αναφοράς. Ορίζεται μαζί με το NodeEnumerator στην ίδια περιοχή Nodes.Navigation της επιφάνειας API, αντανακλώντας τον ρόλο του στην παρακολούθηση αλλαγών θέσης κατά τη διάρκεια της enumeration.
Συμβουλές και Καλές Πρακτικές
- Χρησιμοποιήστε ένα τυπικό C#
foreachπάνω από οποιοδήποτεCompositeNode(ή καλέστε το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 απευθείας;
Συνήθως όχι — το τυπικό C# foreach πάνω σε ένα CompositeNode το χρησιμοποιεί έμμεσα μέσω του GetEnumerator(). Χρησιμοποιήστε το απευθείας μόνο όταν χρειάζεστε άμεσο έλεγχο πάνω στο Dispose()/Reset().
Τι περιγράφει το DocumentPositionMovement;
Η σχέση μεταξύ δύο θέσεων στο δέντρο του εγγράφου κατά την πλοήγηση — None, Inside, StartEnd, Sibling, Above ή Below.
Πώς διαφέρει αυτό από τα API διαχείρισης δέντρου στη σελίδα Nodes;
Το Nodes Η σελίδα καλύπτει την εισαγωγή, την αφαίρεση, την κλωνοποίηση και την αναδιοργάνωση κόμβων. Αυτή η σελίδα καλύπτει την ανάγνωση μόνο διάσχιση και τοποθέτηση μέσα σε ένα δέντρο που ήδη υπάρχει.
API Reference Σύνοψη
| Κλάση / Enum | Περιγραφή |
|---|---|
NodeEnumerator | IEnumerator<Node> / IDocumentPositionListener υλοποίηση πίσω από την επανάληψη for-each; Dispose(), Reset() |
DocumentPositionMovement | Enum με έξι μέλη που περιγράφει τη σχετική θέση κατά τη διάσχιση (None, Inside, StartEnd, Sibling, Above, Below) |
CompositeNode.GetEnumerator() | Επιστρέφει τον enumerator για τα άμεσα παιδιά ενός κόμβου |