Aspose.Words Document Object Model (DOM)
يعد Aspose.Words Document Object Model (DOM) تمثيلاً في الذاكرة لمستند Word. يسمح لك Aspose.Words DOM بقراءة محتوى وتنسيق مستند Word ومعالجته وتعديله برمجيًا.
يصف هذا القسم الفئات الرئيسية لـ Aspose.Words DOM وعلاقاتها. باستخدام فئات Aspose.Words DOM، يمكنك الحصول على وصول برمجي إلى عناصر المستند وتنسيقه.
قم بإنشاء شجرة كائنات Document
عند قراءة مستند في Aspose.Words DOM، يتم إنشاء شجرة كائنات وأنواع مختلفة من عناصر المستند المصدر لها كائنات شجرة DOM خاصة بها ذات خصائص مختلفة.
بناء شجرة عقد الوثيقة
عندما يقرأ Aspose.Words مستند Word في الذاكرة، فإنه يقوم بإنشاء كائنات من أنواع مختلفة تمثل عناصر المستند المختلفة. كل تشغيل لنص أو فقرة أو جدول أو قسم هو عقدة، وحتى الوثيقة نفسها هي عقدة. يحدد Aspose.Words فئة لكل نوع عقدة مستند.
تتبع شجرة المستندات في Aspose.Words نمط التصميم المركب:
- جميع فئات العقد مستمدة في النهاية من فئة Node، وهي الفئة الأساسية في Aspose.Words Document Object Model.
- العقد التي يمكن أن تحتوي على عقد أخرى، على سبيل المثال، Section أو Paragraph، مشتقة من فئة CompositeNode، والتي بدورها مشتقة من فئة Node.
يوضح الرسم البياني أدناه الوراثة بين فئات العقد في Aspose.Words Document Object Model (DOM). أسماء الفئات المجردة مكتوبة بخط مائل.
لنلقي نظرة على مثال. تُظهر الصورة التالية مستند Microsoft Word بأنواع مختلفة من المحتوى.
عند قراءة المستند أعلاه في Aspose.Words DOM، يتم إنشاء شجرة الكائنات، كما هو موضح في المخطط أدناه.
Document، Section، Paragraph، Table، Shape، Run، وجميع علامات الحذف الأخرى في الرسم التخطيطي هي كائنات Aspose.Words تمثل عناصر مستند Word.
احصل على ملف Node
من النوع
على الرغم من أن فئة Node كافية لتمييز العقد المختلفة عن بعضها البعض، إلا أن Aspose.Words توفر تعداد NodeType لتبسيط بعض مهام API، مثل تحديد العقد من نوع معين.
يمكن الحصول على نوع كل عقدة باستخدام خاصية Node.node_type. تقوم هذه الخاصية بإرجاع قيمة تعداد NodeType. على سبيل المثال، تقوم عقدة الفقرة الممثلة بفئة Paragraph بإرجاع NodeType.PARAGRAPH، وتقوم عقدة الجدول الممثلة بفئة Table بإرجاع NodeType.TABLE.
يوضح المثال التالي كيفية الحصول على نوع العقدة باستخدام تعداد NodeType:
التنقل في شجرة المستندات
يمثل Aspose.Words المستند كشجرة عقدة، مما يتيح لك التنقل بين العقد. يصف هذا القسم كيفية استكشاف شجرة المستندات والتنقل فيها في Aspose.Words.
عند فتح نموذج المستند، الذي تم تقديمه سابقًا، في Document Explorer، تظهر شجرة العقدة تمامًا كما تم تمثيلها في Aspose.Words.
علاقات عقد الوثيقة
العقد الموجودة في الشجرة لها علاقات فيما بينها:
- العقدة التي تحتوي على عقدة أخرى هي parent.
- العقدة الموجودة في العقدة الأصلية هي عقد child. الفرعية لنفس الأصل وهي عقد sibling.
- عقدة root هي دائمًا عقدة Document.
العقد التي يمكن أن تحتوي على عقد أخرى مشتقة من فئة CompositeNode، وجميع العقد مشتقة في النهاية من فئة Node. توفر هاتان الفئتان الأساسيتان طرقًا وخصائص شائعة للتنقل وتعديل بنية الشجرة.
يُظهر الرسم التخطيطي لكائن UML التالي عدة عقد من نموذج المستند وعلاقاتها ببعضها البعض عبر خصائص الأصل والفرع والأخوة:
المستند هو مالك العقدة
تنتمي العقدة دائمًا إلى مستند معين، حتى لو تم إنشاؤها للتو أو إزالتها من الشجرة، لأنه يتم تخزين الهياكل الحيوية على مستوى المستند مثل الأنماط والقوائم في عقدة Document. على سبيل المثال، ليس من الممكن أن يكون لديك Paragraph بدون Document لأن كل فقرة لها نمط معين يتم تعريفه عالميًا للمستند. يتم استخدام هذه القاعدة عند إنشاء أي عقد جديدة. تتطلب إضافة Paragraph جديد مباشرةً إلى ملف DOM تمرير كائن مستند إلى المُنشئ.
عند إنشاء فقرة جديدة باستخدام DocumentBuilder، يكون لدى المنشئ دائمًا فئة Document مرتبطة بها من خلال خاصية DocumentBuilder.document.
يوضح مثال التعليمات البرمجية التالي أنه عند إنشاء أي عقدة، يتم دائمًا تحديد المستند الذي سيمتلك العقدة:
عقدة الأم
كل عقدة لها أصل محدد بواسطة خاصية parent_node. لا تحتوي العقدة على عقدة أصل، أي أن parent_node هو None، في الحالات التالية:
- تم إنشاء العقدة للتو ولم تتم إضافتها إلى الشجرة بعد.
- تمت إزالة العقدة من الشجرة.
- هذه هي عقدة Document الجذرية التي لا تحتوي دائمًا على عقدة أصل.
يمكنك إزالة عقدة من العقدة الأصلية عن طريق استدعاء طريقة Node.remove. يوضح مثال التعليمات البرمجية التالي كيفية الوصول إلى العقدة الأصلية:
العقد الطفل
الطريقة الأكثر فعالية للوصول إلى العقد الفرعية لـ CompositeNode هي عبر خصائص first_child وlast_child التي تُرجع العقد الفرعية الأولى والأخيرة، على التوالي. في حالة عدم وجود عقد فرعية، تقوم هذه الخصائص بإرجاع None.
يوفر CompositeNode أيضًا مجموعة get_child_nodes التي تتيح الوصول المفهرس أو التعدادي إلى العقد الفرعية. تقوم طريقة get_child_nodes بإرجاع مجموعة مباشرة من العقد، مما يعني أنه كلما تم تغيير المستند، كما هو الحال عند إزالة العقد أو إضافتها، يتم تحديث مجموعة get_child_nodes تلقائيًا.
إذا لم يكن للعقدة أي فرع، فإن طريقة get_child_nodes ترجع مجموعة فارغة. يمكنك التحقق مما إذا كان CompositeNode يحتوي على أي عقد فرعية باستخدام خاصية has_child_nodes.
يوضح مثال التعليمات البرمجية التالي كيفية تعداد العقد الفرعية المباشرة لـ CompositeNode باستخدام العداد الذي توفره مجموعة get_child_nodes:
العقد الأخوة
يمكنك الحصول على العقدة التي تسبق أو تتبع عقدة معينة مباشرة باستخدام خصائص previous_sibling وnext_sibling، على التوالي. إذا كانت العقدة هي الابن الأخير للأصل، فإن خاصية next_sibling هي None. على العكس من ذلك، إذا كانت العقدة هي الابن الأول لأصلها، فإن خاصية previous_sibling هي None.
يوضح مثال التعليمات البرمجية التالي كيفية زيارة جميع العقد الفرعية المباشرة وغير المباشرة للعقدة المركبة بكفاءة:
الوصول المكتوب إلى العقد التابعة والأصل
لقد ناقشنا حتى الآن الخصائص التي تُرجع أحد الأنواع الأساسية – Node أو CompositeNode. ولكن في بعض الأحيان توجد مواقف قد تحتاج فيها إلى إرسال القيم إلى فئة عقدة معينة، مثل Run أو Paragraph. أي أنه لا يمكنك الابتعاد تمامًا عن عملية الصب عند العمل باستخدام Aspose.Words DOM المركب.
لتقليل الحاجة إلى الإرسال، توفر معظم فئات Aspose.Words خصائص ومجموعات توفر وصولاً مكتوبًا بقوة. هناك ثلاثة أنماط أساسية للوصول المكتوب:
- تعرض العقدة الأصلية خصائص first_XXX وlast_XXX المكتوبة. على سبيل المثال، يحتوي ملف Document على خصائص first_section وlast_section. وبالمثل، يتمتع Table بخصائص مثل first_row وlast_row وغيرها.
- تعرض العقدة الأصلية مجموعة مكتوبة من العقد الفرعية، مثل Document.sections وBody.paragraphs وغيرها.
- توفر العقدة الفرعية وصولاً مكتوبًا إلى العقدة الأصلية، مثل Run.parent_paragraph وParagraph.parent_section وغيرها.
الخصائص المكتوبة هي مجرد اختصارات مفيدة توفر أحيانًا وصولاً أسهل من الخصائص العامة الموروثة من Node.parent_node وCompositeNode.first_child.
يوضح مثال التعليمات البرمجية التالي كيفية استخدام الخصائص المكتوبة للوصول إلى عقد شجرة المستندات: