نحوه کار با نشانهگذاری سفارشی XML در .NET
نحوه کار با نشانهگذاری سفارشی XML در .NET
یک سند Word میتواند دادههای سفارشی XML را در کنار محتوای قابل مشاهده خود حمل کند — دادههایی که برای اتصال کنترلهای محتوا، ذخیره فرادادههای مخصوص برنامه، یا جاسازی بخشهایی که توسط برنامه دیگری اضافه شدهاند، استفاده میشوند. این راهنما نشان میدهد چگونه این دادهها را بخوانید، بخشهای سفارشی جدید XML را اضافه کنید، و برچسبهای هوشمند قدیمی که ممکن است اسناد قدیمی هنوز شامل آن باشند را بررسی کنید، با استفاده از CustomXmlPart، CustomXmlProperty، و SmartTag در Aspose.Words FOSS برای .NET.
راهنمای گامبهگام
مرحله 1: خواندن دادههای سفارشی XML از یک سند
Document.CustomXmlParts یک CustomXmlPartCollection برمیگرداند — همان مکانیزمی که Word برای پشتیبانی از کنترلهای محتوا با نقشهبرداری XML استفاده میکند. مجموعه را تکرار کنید، یا زمانی که قبلاً میدانید به کدام بخش نیاز دارید، GetById(id) را صدا بزنید تا یک CustomXmlPart دریافت کنید. هر بخش Id را ارائه میدهد، یک آرایه بایتی Data که XML خام را نگه میدارد، یک DataChecksum برای تشخیص اینکه آیا داده تغییر کرده است بدون مقایسه بایت به بایت کامل، و Schemas — یک CustomXmlSchemaCollection که فهرست طرحوارههای XML مرتبط با آن را نشان میدهد.
مرحله 2: افزودن یا بهروزرسانی یک بخش سفارشی XML
با فراخوانی CustomXmlPartCollection.Add(id, xml) همراه با یک رشتهٔ شناسه و محتوای XML یک بخش را بهصورت مستقیم ایجاد کنید، یا یک CustomXmlPart را بهطور جداگانه بسازید و به Add(part) پاس بدهید. برای حذف دادهها، از RemoveAt(index) در موقعیت خاصی استفاده کنید یا از Clear() برای حذف تمام بخشها استفاده کنید. هنگام کپیکردن دادههای سفارشی XML بین اسناد، بهجای خواندن مجدد و افزودن دوبارهٔ خام XML، از CustomXmlPart.Clone() (یا Clone() مجموعه) بر روی بخش منبع استفاده کنید، سپس کلون را به Document.CustomXmlParts سند هدف اضافه کنید.
مرحلهٔ ۳: مدیریت طرحوارههای مرتبط با یک بخش
CustomXmlPart.Schemas به یک CustomXmlSchemaCollection میرسد که URIهای طرحواره مرتبط با بخش را بهعنوان رشتههای ساده بهجای اشیاء طرحواره تجزیهشده پیگیری میکند. از Add(value) برای ثبت یک URI طرحواره استفاده کنید، Remove(name) یا RemoveAt(index) برای حذف یک URI، IndexOf(value) برای یافتن یک URI، و Clear() برای حذف همهٔ آنها. Count تعداد URIهای طرحوارهای که در حال حاضر با بخش مرتبط هستند را گزارش میدهد.
مرحلهٔ ۴: کار با بخشهای سفارشی در سطح بسته
همهٔ بخشهای غیرقابل مشاهده در یک بسته OOXML لزوماً XML سفارشی نیستند. Document.PackageCustomParts یک CustomPartCollection از اشیاء CustomPart برمیگرداند — بخشهای دلخواهی که در بسته ذخیره شدهاند، مانند بخشهایی که توسط برنامهٔ دیگری که فایل را دستکاری کرده اضافه شدهاند. هر CustomPart دارای Name، ContentType، RelationshipType، یک آرایه بایت Data و یک پرچم IsExternal است که نشان میدهد آیا یک ارجاع خارجی است نه محتوای جاسازیشده. Add(part)، RemoveAt(index) و Clear() مجموعه را به همان شیوهٔ CustomXmlPartCollection مدیریت میکنند. هنگامیکه بخشی که سند شما باید داشته باشد در مجموعهٔ XML سفارشی ظاهر نمیشود، PackageCustomParts را بررسی کنید — نه CustomXmlParts.
مرحلهٔ ۵: بررسی برچسبهای هوشمند قدیمی و ویژگیهای آنها
SmartTag یک نوع گره است (NodeType.SmartTag، ساخته شده با SmartTag(doc)) که یک برچسب هوشمند قدیمی Word را که دور متن شناساییشده پیچیده شده است، نشان میدهد. برای شناسایی اینکه کدام شناساییکننده برچسب را ایجاد کرده است، Element و Uri را همراهاً بررسی کنید، سپس Properties را بخوانید — یک CustomXmlPropertyCollection — برای دادههای ساختاری که شناساییکننده به آن الصاق کرده است. درون یک CustomXmlPropertyCollection، ایندکسگر (مثلاً properties["MyProp"]) یا Contains(name) یک ویژگی خاص را جستجو میکنند، IndexOfKey(name) موقعیت آن را برمیگرداند، و Remove(name)/RemoveAt(index)/Clear() ورودیها را حذف میکنند؛ هر CustomXmlProperty با CustomXmlProperty(name, uri, value) ساخته میشود و Name، Uri و Value را نمایان میکند. چون SmartTag از CompositeNode ارث میگیرد، در درخت سند مانند گرههای دیگر شرکت میکند و Accept(visitor)، AcceptStart(visitor) و AcceptEnd(visitor) را برای پیمایش مبتنی بر DocumentVisitor پشتیبانی میکند.
مشکلات رایج و راهحلها
CustomXmlPartCollection.GetById(id) هیچچیزی قابل استفادهای برنمیگرداند. شناسه با هیچ بخشی که در حال حاضر وجود دارد مطابقت ندارد Document.CustomXmlParts. مجموعه را فهرست کنید تا تأیید شود شناسه موجود است، یا ابتدا بخش را اضافه کنید با Add(id, xml).
بخشی که توسط برنامهای دیگر اضافه شده است، با تکرار پیدا نمیشود CustomXmlParts. بخشهای بسته غیر-XML از طریق Document.PackageCustomParts، نه CustomXmlParts. بررسی کنید PackageCustomParts (a CustomPartCollection) بهجای آن.
SmartTag.Properties خالی است حتی اگر برچسب به وضوح موجود باشد. هر تشخیصگر برچسب هوشمند ساختارهای خاصی را پیوست نمیکند. بررسی کنید SmartTag.Element and Uri برای تأیید اینکه کدام تشخیصگر برچسب را ایجاد کرده است، پیش از اینکه فرض کنید خواص خاصی وجود خواهد داشت.
دادههای سفارشی XML به نظر نمیرسد به کنترل محتوا که باید به آن متصل شود، مرتبط باشد. کنترلهای محتوا از طریق پیکربندی بایندینگ داده خود به XML سفارشی متصل میشوند، نه بهصورت خودکار به هر CustomXmlPart in Document.CustomXmlParts. تأیید کنید که کدام بخش از یک کنترل محتوا در واقع به آن متصل است، بهجای اینکه فرض کنید رابطهٔ یک-به-یک وجود دارد.
سوالات متداول
چگونه میتوانم دادههای سفارشی XML را به یک سند اضافه کنم؟
با یک رشتهٔ شناسه و محتوای XML، Document.CustomXmlParts.Add(id, xml) را فراخوانی کنید، یا بهصورت جداگانه یک CustomXmlPart بسازید و آن را به Add(part) پاس دهید.
فرق بین CustomXmlPart و CustomXmlProperty چیست؟
CustomXmlPart یک جزیره دادهٔ کامل XML است — یک بار بایت آرایه بههمراه طرحنامههای مرتبط — که از طریق Document.CustomXmlParts دسترسی میشود. CustomXmlProperty یک جفت نام/مقدار تک است که معمولاً از طریق SmartTag.Properties بهجای دسترسی مستقیم از سند دسترسی میشود.
چگونه میتوانم دادههای سفارشی XML را از یک سند به سند دیگر کپی کنم؟
متد Clone() را روی CustomXmlPart منبع فراخوانی کنید، سپس کلون را با Add(part) به Document.CustomXmlParts سند هدف اضافه کنید.
SmartTag چیست و کی ممکن است با آن مواجه شوم؟
SmartTag یک ویژگی قدیمی ورد است که متنی را که توسط یک تشخیصگر smart-tag شناسایی و بستهبندی شده است، نمایش میدهد — یک گره سند (NodeType.SmartTag) با یک Element و Uri که تشخیصگر را شناسایی میکنند، بههمراه یک مجموعه Properties از مقادیر CustomXmlProperty. این ویژگی در اسنادی ظاهر میشود که در نسخههای قدیمی ورد با فعالسازی smart tags ساخته یا ویرایش شدهاند.
چگونه میتوانم تعداد بخشهای سفارشی XML یا بخشهای بستهٔ یک سند را بدانم؟
بهطور متناسب، Count را روی Document.CustomXmlParts (یک CustomXmlPartCollection) یا Document.PackageCustomParts (یک CustomPartCollection) بخوانید.