Aspose.Words Document Object Model (DOM)

Aspose.Words Document Object Model (DOM) یک نمایش در حافظه یک سند Word است. Aspose.Words DOM به شما این امکان را می دهد که به صورت برنامه نویسی محتوا و قالب بندی یک سند Word را بخوانید، دستکاری و تغییر دهید.

این بخش کلاس های اصلی Aspose.Words DOM و روابط آنها را توضیح می دهد. با استفاده از کلاس های Aspose.Words DOM، می توانید به عناصر سند و قالب بندی دسترسی برنامه ای داشته باشید.

یک {#create-a-document-objects-tree} درختی Document Objects ایجاد کنید

هنگامی که یک سند در Aspose.Words DOM خوانده می‌شود، یک درخت شی ساخته می‌شود و انواع مختلف عناصر سند منبع، اشیاء درخت DOM خود را با ویژگی‌های مختلف دارند.

Build Document Nodes Tree

هنگامی که Aspose.Words یک سند Word را در حافظه می خواند، اشیایی از انواع مختلف ایجاد می کند که عناصر مختلف سند را نشان می دهد. هر اجرای یک متن، پاراگراف، جدول یا یک بخش یک گره است و حتی خود سند نیز یک گره است. Aspose.Words برای هر نوع گره سند یک کلاس تعریف می کند.

درخت سند در Aspose.Words از الگوی طراحی ترکیبی پیروی می کند:

  • تمام کلاس های گره در نهایت از کلاس Node که کلاس پایه در Aspose.Words Document Object Model است، مشتق می شوند.
  • گره هایی که می توانند شامل گره های دیگری باشند، به عنوان مثال، Section یا Paragraph، از کلاس CompositeNode مشتق می شوند که به نوبه خود از کلاس Node مشتق می شود.

نمودار ارائه شده در زیر وراثت بین کلاس های گره Aspose.Words Document Object Model (DOM) را نشان می دهد. نام کلاس های انتزاعی به صورت کج می باشد.

aspose-words-dom

بیایید به یک مثال نگاه کنیم. تصویر زیر یک سند Microsoft Word را با انواع مختلف محتوا نشان می دهد.

سند-مثال-عنوان-کلمات

هنگام خواندن سند بالا در Aspose.Words DOM، درخت اشیا ایجاد می شود، همانطور که در طرح زیر نشان داده شده است.

dom-aspose-words

Document، Section، Paragraph، Table، Shape، Run، و تمام بیضی‌های دیگر روی نمودار، اشیایی Aspose.Words هستند که عناصر سند Word را نشان می‌دهند.

یک Node Type {#get-a-node-type} دریافت کنید

اگرچه کلاس 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 است که همیشه یک گره والد None دارد.

می توانید با فراخوانی متد Node.remove یک گره را از والد آن حذف کنید. مثال کد زیر نحوه دسترسی به گره والد را نشان می دهد:

گره های کودک

کارآمدترین راه برای دسترسی به گره های فرزند یک CompositeNode از طریق ویژگی های first_child و last_child است که به ترتیب اولین و آخرین گره فرزند را برمی گرداند. اگر هیچ گره فرزندی وجود نداشته باشد، این ویژگی ها None را برمی گرداند.

CompositeNode همچنین مجموعه get_child_nodes را فراهم می کند که امکان دسترسی فهرست شده یا شمارش شده به گره های فرزند را فراهم می کند. روش get_child_nodes مجموعه ای زنده از گره ها را برمی گرداند، به این معنی که هر زمان که سند تغییر می کند، مانند زمانی که گره ها حذف یا اضافه می شوند، مجموعه get_child_nodes به طور خودکار به روز می شود.

اگر یک گره فرزندی نداشته باشد، روش get_child_nodes یک مجموعه خالی را برمی گرداند. با استفاده از ویژگی has_child_nodes می توانید بررسی کنید که آیا CompositeNode دارای گره های فرزند است یا خیر.

مثال کد زیر نحوه شمارش گره های فرزند فوری یک 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 ارائه می دهند.

مثال کد زیر نحوه استفاده از خصوصیات تایپ شده برای دسترسی به گره های درخت سند را نشان می دهد: