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

فئة / تعدادوصف
NodeEnumeratorIEnumerator<Node> / IDocumentPositionListener تنفيذ خلف تكرار for-each؛ Dispose(), Reset()
DocumentPositionMovementتعداد مكوّن من ستة أعضاء يصف الموضع النسبي أثناء التجوال (None, Inside, StartEnd, Sibling, Above, Below)
CompositeNode.GetEnumerator()يعيد enumerator لأبناء العقدة المباشرين

انظر أيضاً

 العربية