Navigation
Navigation
Aspose.Words FOSS for .NET يتضمن جزءًا صغيرًا Nodes.Navigation مساحة أسماء للتكرار وتحديد المواقع داخل شجرة عقد المستند: NodeEnumerator, نوع المُعدِّد وراء التكرار بنمط for-each على العقد الفرعية، و DocumentPositionMovement, تعداد يصف كيف ترتبط موضع عقدة بأخرى أثناء التجوال. هذا مختلف عن واجهات برمجة التطبيقات للتعامل مع الشجرة (الإدراج، الإزالة، وإعادة تنظيم العقد) التي تم تغطيتها في 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.
كيف يختلف هذا عن واجهات برمجة التطبيقات الخاصة بتعديل الشجرة في صفحة Nodes؟
ال Nodes الصفحة تغطي إدراج وإزالة واستنساخ وإعادة تنظيم العقد. هذه الصفحة تغطي التجوال في وضع القراءة فقط وتحديد المواقع داخل شجرة موجودة مسبقًا.
ملخص API Reference
| فئة / تعداد | وصف |
|---|---|
NodeEnumerator | IEnumerator<Node> / IDocumentPositionListener تنفيذ خلف تكرار for-each؛ Dispose(), Reset() |
DocumentPositionMovement | تعداد مكوّن من ستة أعضاء يصف الموضع النسبي أثناء التجوال (None, Inside, StartEnd, Sibling, Above, Below) |
CompositeNode.GetEnumerator() | يعيد enumerator لأبناء العقدة المباشرين |