Navigation
Navigation
Aspose.Words FOSS עבור .NET כולל קטן Nodes.Navigation namespace לאיטרציה ולמיקום בתוך עץ הצמתים של מסמך: NodeEnumerator, סוג המונה (enumerator) שמאחורי חזרה בסגנון for-each על צמתים בנים, ו DocumentPositionMovement, מונה המתאר כיצד מיקום של צומת אחד קשור לאחר במהלך הניווט. זה נפרד מ-APIs של מניפולציית העץ (הוספה, הסרה וארגון מחדש של צמתים) המתוארים ב Nodes הדף — דף זה מכסה תנועה והשוואת מיקומים בעץ שכבר קיים.
איטרציה על צמתים בנים
כל CompositeNode (מחלקת הבסיס לצמתים ממכלים כגון Document, Section, Body ו-Paragraph) תומך באיטרציה בסגנון for-each על הילדים הישירים שלו דרך GetEnumerator(), אשר — על פי התיעוד שלו — מספק תמיכה באיטרציה בסגנון for-each על צמתים בנים של צומת. המונה המוחזר מממש את IEnumerator<Node>; במשטח API זה, תפקיד זה ממלא NodeEnumerator, שגם הוא מממש את IDocumentPositionListener כדי שיוכל לעקוב אחרי שינויי המיקום בזמן שהעץ הבסיסי נמסר. NodeEnumerator חושף את החברים הסטנדרטיים Dispose() ו-Reset() לצד החוזה IEnumerator<Node>.
תנועת מיקום המסמך
DocumentPositionMovement הוא מונה עם שישה ערכים — None, Inside, StartEnd, Sibling, Above ו-Below — המתארים כיצד מיקום אחד במסמך קשור לאחר בעת ניווט בעץ: האם הוא ללא שינוי, הוזז לתוך צומת, הוזז לגבול תחילה/סיום, הוזז לאחיו, או הוזז למעלה או למטה מהמיקום הרפרנס. הוא מוגדר לצד NodeEnumerator באותו תחום Nodes.Navigation של משטח API, ומשקף את תפקידו במעקב אחרי שינויי מיקום במהלך האיטרציה.
טיפים ושיטות עבודה מומלצות
- השתמש ב-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 עבור הילדים הישירים של צומת |