Как работать со Structured Document Tags в .NET

Как работать со Structured Document Tags в .NET

Это руководство показывает, как вставлять, настраивать, находить, удалять и привязывать данные к структурированным тегам документа (элементам управления содержимым) в Aspose.Words FOSS for .NET, используя StructuredDocumentTag класс в Aspose.Words.Markup пространстве имён. Описываются типы элементов управления содержимым DocumentBuilder могут вставлять, задавая типо-специфическое содержимое, такое как состояние флажка или варианты выпадающего списка, находя элементы управления по тегу или заголовку, удаляя элемент управления вместе с его содержимым или без него, и сопоставляя элемент управления с пользовательскими данными XML.

Пошаговое руководство

Шаг 1: Установить пакет

Aspose.Words FOSS for .NET пока не публикует пакет NuGet — вместо этого соберите библиотеку из исходного кода. Клонируйте https://github.com/aspose-words-foss/Aspose.Words-FOSS-for-.NET.git, затем соберите Aspose.Words.sln в конфигурации Release с помощью SDK .NET и подключите полученную сборку Aspose.Words к вашему проекту. Библиотека ориентирована на .NET Standard 2.0, поэтому она работает на .NET Framework 4.6.2+ и .NET 6/8/10.


Шаг 2: Импортировать необходимые классы

Добавьте директиву using Aspose.Words; для Document и DocumentBuilder, а также директиву using Aspose.Words.Markup; для StructuredDocumentTag, SdtType, SdtListItem, SdtListItemCollection, XmlMapping и остальных классов элементов управления содержимым, рассматриваемых в этом руководстве.


Шаг 3: Проверьте, какие типы элементов управления содержимым вы можете вставить

Прежде чем вставлять, проверьте, является ли целевой SdtType одним из семи типов, принимаемых DocumentBuilder.InsertStructuredDocumentTag(SdtType): PlainText, RichText, Checkbox, DropDownList, ComboBox, Picture и Date. RepeatingSection и RepeatingSectionItem нельзя вставить в позицию текстового курсора этим способом — они охватывают целые абзацы или строки таблицы. Оставшиеся значения SdtType, которые могут присутствовать в файле Word, но не отображаются в пользовательском интерфейсе Word как вставляемые типы — None, Bibliography, Citation, Equation, BuildingBlockGallery, DocPartObj, Group и EntityPicker — вообще не принимаются этим методом вставки.


Шаг 4: Вставьте элемент управления содержимым в позицию курсора

Вызовите DocumentBuilder.InsertStructuredDocumentTag(SdtType) с одним из семи поддерживаемых типов, чтобы вставить новый элемент управления в текущую позицию курсора построителя; вызов возвращает новый StructuredDocumentTag. Установите Tag и Title у возвращённого элемента, чтобы задать идентифицирующие строки, которые авторы видят в Word, и задайте PlaceholderName (поддерживаемый Placeholder BuildingBlock) для текста подсказки, который Word отображает, пока элемент пуст — IsShowingPlaceholderText сообщает, отображается ли сейчас эта подсказка.


Шаг 5: Настройте содержимое, специфичное для типа

Для элемента управления флажком читайте или задавайте StructuredDocumentTag.Checked и вызывайте SetCheckedSymbol() / SetUncheckedSymbol(), чтобы настроить отображаемые символы для каждого состояния. Для элемента управления датой задайте FullDate, при этом DateDisplayFormat и DateDisplayLocale определяют, как он отображается, DateStorageFormat (SdtDateStorageFormat) контролирует, как он сохраняется при привязке к данным XML, а CalendarType (SdtCalendarType) выбирает календарную систему. Для раскрывающегося списка или комбобокса заполните ListItems — SdtListItemCollection из SdtListItem (DisplayText, Value) — перед тем как установить SelectedValue для выбора активного пункта. Для элемента управления простым текстом Multiline является свойством bool на StructuredDocumentTag, которое можно задать для конфигурации элемента.


Шаг 6: Вид элемента управления и блокировка

Задайте Appearance (SdtAppearance), чтобы управлять тем, как элемент визуально выделяется в Word, и Color, чтобы установить его цвет выделения. ContentsFont и EndCharacterFont определяют шрифт, применяемый к содержимому элемента, и его завершающий символ. LockContentControl и LockContents — независимые переключатели: задайте LockContentControl, чтобы запретить удаление самого элемента, и LockContents, чтобы запретить редактирование его содержимого, не влияя на другое.


Шаг 7: Поиск и удаление элементов управления содержимым

Прочитайте Range.StructuredDocumentTags — StructuredDocumentTagCollection, ограниченный этим диапазоном — и вызовите GetById(), GetByTag() или GetByTitle(), чтобы найти конкретный элемент управления, либо Remove() / RemoveAt() в коллекции, чтобы удалить его по ссылке или индексу. Для отдельного элемента управления вызовите Remove(), чтобы удалить элемент вместе с его содержимым, RemoveSelfOnly(), чтобы удалить только оболочку, оставив содержимое в документе, или Clear(), чтобы очистить его содержимое, оставив сам элемент управления на месте.


Шаг 8: Привязка элемента управления к пользовательским данным XML

Прочитайте StructuredDocumentTag.XmlMapping — экземпляр XmlMapping — и вызовите SetMapping(customXmlPart, xPath, prefixMapping), чтобы привязать элемент управления к существующей пользовательской части XML, уже находящейся в пользовательском хранилище данных XML документа, используя выражение XPath для выбора привязанного элемента. XmlMapping.IsMapped сообщает, активна ли привязка в данный момент, CustomXmlPart и StoreItemId определяют привязанную часть данных, а Delete() удаляет сопоставление.


Шаг 9: Обработка элементов управления, охватывающих несколько разделов

Элемент управления, охватывающий более одного раздела документа — о чём сообщает IsMultiSection — представлен не одним узлом StructuredDocumentTag, а парой StructuredDocumentTagRangeStart / StructuredDocumentTagRangeEnd, соединёнными через StructuredDocumentTagRangeStart.RangeEnd. Программируйте против общего интерфейса IStructuredDocumentTag (Tag, Title, Placeholder, PlaceholderName, Appearance, IsShowingPlaceholderText, RemoveSelfOnly()), когда коду необходимо единообразно обрабатывать как одиночные узлы, так и диапазонные формы, вместо ветвления по конкретному типу.

Распространённые проблемы и решения

InsertStructuredDocumentTag выбрасывает NotImplementedException Запрошенный SdtType – например Citation, Equation, или BuildingBlockGallery – не является одним из семи вставляемых типов. Используйте PlainText, RichText, Checkbox, DropDownList, ComboBox, Picture, или Date вместо этого.

InsertStructuredDocumentTag выбрасывает InvalidOperationException RepeatingSection or RepeatingSectionItem было запрошено в текстовом курсоре. Эти два типа охватывают целые абзацы или строки таблицы, а не вставляются в позицию курсора.

Удаление элемента управления содержимым также удаляет текст внутри него Remove() удаляет элемент управления и его содержимое вместе. Вызовите RemoveSelfOnly() вместо этого, чтобы сохранить содержимое в документе и удалить только оболочку.

Флажок не отображает ожидаемый символ Пользовательские значки отмеченного и неотмеченного состояния никогда не устанавливались. Вызовите SetCheckedSymbol() and SetUncheckedSymbol() на элементе управления.

В раскрывающемся списке или комбобоксе не отображаются варианты ListItems никогда не заполнялся. Добавьте SdtListItem записей в элемент управления ListItems коллекцию перед тем, как ожидать появления вариантов, затем установите SelectedValue чтобы выбрать активный.

Часто задаваемые вопросы

Какие типы элементов управления содержимым я могу вставлять непосредственно с помощью DocumentBuilder?

PlainText, RichText, Checkbox, DropDownList, ComboBox, Picture и Date. Другие значения SdtType не поддерживаются InsertStructuredDocumentTag().

Как найти все контролы содержимого с определённым тегом?

Прочитайте Range.StructuredDocumentTags и вызовите GetByTag(), либо GetByTitle() / GetById(), если вместо этого сопоставлять эти идентификаторы.

Как удалить контрол содержимого, оставив его содержимое в документе?

Вызовите StructuredDocumentTag.RemoveSelfOnly(), а не Remove().

Как привязать контрол содержимого к пользовательским данным XML?

Вызовите XmlMapping.SetMapping() у XmlMapping контрола, указывая на существующую пользовательскую часть XML и выражение XPath внутри неё.

Чем контрол содержимого, охватывающий несколько разделов, отличается от обычного?

Он представлен парой StructuredDocumentTagRangeStart / StructuredDocumentTagRangeEnd вместо одного узла StructuredDocumentTag; обе формы реализуют IStructuredDocumentTag, поэтому IsMultiSection указывает, с какой формой вы работаете.

См. также:

 Русский