---
title: "Как да извличате съдържание между възли на документи"
---

Когато работите с документи, е важно да можете лесно да извличате съдържание от определен диапазон в документа. Съдържанието обаче може да се състои от сложни елементи като параграфи, таблици, изображения и т.н.

Независимо от това какво съдържание трябва да бъде извлечено, методът за извличане на това съдържание винаги ще се определя от това кои възли са избрани за извличане на съдържание между. Те могат да бъдат цели текстови тела или прости текстови работи.

Има много възможни ситуации и следователно много различни типове възли, които трябва да се вземат предвид при извличане на съдържание. Например, може да искате да извлечете съдържание между:

- Два конкретни параграфа
- Специфични серии от текст
- Полета от различни видове, като например сливащи се полета
- Начални и крайни диапазони на отметка или коментар
- Различни части от текста, съдържащи се в отделни раздели

В някои ситуации може дори да се наложи да комбинирате различни типове възли, като извличане на съдържание между абзац и поле или между изпълнение и отметка.

Тази статия предоставя имплементация на код за извличане на текст между различни възли, както и примери за общи сценарии.

```

Това са само няколко примера за многото възможности. Планираме функционалността за извличане на текст да бъде част от обществеността API в бъдеще и няма да се изисква допълнителен код. В същото време, не се колебайте да публикувате вашите искания относно тази функционалност на [Aspose.Words форум](https://forum.aspose.com/c/words/8).

```

## Защо Да Извличаме Съдържание

Често целта на извличането на съдържанието е да го дублирате или запишете отделно в нов документ. Например, можете да извличате съдържание и:

- Копирайте го в отделен документ
- Преобразуване на определена част от документ в PDF или изображение
- Дублиране на съдържанието в документа много пъти
- Работа с извлечено съдържание отделно от останалата част на документа

Това може лесно да се постигне с Aspose.Words и прилагането на кода по-долу.

## Алгоритъм За Извличане На Съдържание

Кодът в този раздел разглежда всички възможни ситуации, описани по-горе, с един обобщен и многократно използваем метод. Общото описание на тази техника включва:

1. Събиране на възлите, които диктуват областта на съдържанието, което ще бъде извлечено от вашия документ. Извличането на тези възли се обработва от потребителя в техния код, въз основа на това, което искат да бъдат извлечени.
1. Преминаване на тези възли към метода **ExtractContent**, предоставен по-долу. Трябва също така да преминете булев параметър, който гласи дали тези възли, действащи като маркери, трябва да бъдат включени в екстракцията или не.
1. Извличане на списък с клонирано съдържание (копирани възли), указано да бъде извлечено. Можете да използвате този списък с възли по всякакъв приложим начин, например създаване на нов документ, съдържащ само избраното съдържание.

## Как да извличаме съдържание

За да извлечете съдържанието от вашия документ, трябва да се обадите на метода `ExtractContent` по-долу и да подадете съответните параметри. Основната основа на този метод включва намирането на възли на ниво блок (параграфи и таблици) и клонирането им, за да се създадат идентични копия. Ако преминатите маркерни възли са на блоково ниво, методът може просто да копира съдържанието на това ниво и да го добави към масива.

Ако обаче маркерните възли са вградени (дете на абзац), тогава ситуацията става по-сложна, тъй като е необходимо да се раздели параграфът на вградения възел, било то бягане, полета за отметки и т.н. Съдържанието в клонираните родителски възли, което не присъства между маркерите, се отстранява. Този процес се използва, за да се гарантира, че вградените възли ще запазят форматирането на родителския абзац. Методът също така ще изпълнява проверки на възлите, преминали като параметри и хвърля изключение, ако някой от възлите е невалиден. Параметрите, които трябва да бъдат предадени на този метод са::

1. **StartNode** и **EndNode**. Първите два параметъра са възлите, които определят къде да започне извличането на съдържанието и да завърши съответно. Тези възли могат да бъдат както на блоково ниво (абзац, таблица), така и на вътрешно ниво (напр.бягане, FieldStart, BookmarkStart и т.н.):
   1. За да подадете поле, трябва да подадете съответния обект **FieldStart**.
   1. За да се премине отметките, трябва да се преминат възлите **BookmarkStart** и BookmarkEnd.
   1. За подаване на коментари трябва да се използват възли CommentRangeStart и CommentRangeEnd.
1. **IsInclusive**. Определя дали маркерите са включени в екстракцията или не. Ако тази опция е настроена на невярно и са предадени един и същ възел или последователни възли, ще бъде върнат празен списък.:

      1. Ако е подаден възел **FieldStart**, тази опция определя дали цялото поле трябва да бъде включено или изключено.
      1. Ако е подаден възел **BookmarkStart** или **BookmarkEnd**, тази опция определя дали отметката е включена или само съдържанието между диапазона на отметките.
      1. Ако е подаден възел **CommentRangeStart** или **CommentRangeEnd**, тази опция определя дали самият коментар трябва да бъде включен или само съдържанието в диапазона на коментара.

Прилагането на **ExtractContent** метод можете да намерите [ето](https://github.com/aspose-words/Aspose.Words-for-C/blob/master/Examples/DocsExamples/source/Programming%20with%20Documents/Contents%20Management/Extract%20content%20helper.h). Този метод ще бъде посочен в сценариите в тази статия.

Също така ще дефинираме персонализиран метод за лесно генериране на документ от извлечени възли. Този метод се използва в много от сценариите по-долу и просто създава нов документ и внася извлеченото съдържание в него.

Следващият пример за код показва как да вземете списък с възли и да ги вмъкнете в нов документ.

{{< gist "aspose-words-gists" "922a9c5d9606a0c5cf0682b4aadfaf29" "generate-document.h" >}}

## Извличане На Съдържание Между Абзаците

Това показва как да използвате метода по-горе, за да извлечете съдържание между конкретни параграфи. В този случай искаме да извлечем тялото на писмото, намерено в първата половина на документа. Можем да кажем, че това е между 7-ми и 11-ти абзац.

Кодът по-долу изпълнява тази задача. Съответните параграфи се извличат, като се използва методът [GetChild](https://reference.aspose.com/words/cpp/aspose.words/compositenode/getchild/) на документа и се предават посочените индекси. След това предаваме тези възли на метода **ExtractContent** и заявяваме, че те трябва да бъдат включени в екстракцията. Този метод ще върне копираното съдържание между тези възли, които след това се вмъкват в нов документ.

Следният пример за код показва как да извлечете съдържанието между конкретни параграфи, като използвате метода `ExtractContent` по-горе:

{{< gist "aspose-words-gists" "922a9c5d9606a0c5cf0682b4aadfaf29" "extract-content-between-paragraphs.h" >}}

## Извличане на съдържание Между различни видове възли

Можем да извлечем съдържание между всякакви комбинации от блокове или инлайн възли. В този сценарий по-долу ще извлечем съдържанието между първия параграф и таблицата във втория раздел включително. Получаваме възлите на маркерите, като извикаме метода `Body.FirstParagraph` и [GetChild](https://reference.aspose.com/words/cpp/aspose.words/compositenode/getchild/) във втория раздел на документа, за да извлечем съответните възли на абзаца и таблицата. За лека вариация нека вместо това да дублираме съдържанието и да го вмъкнем под оригинала.

Следният пример за код показва как да извлечете съдържанието между абзац и таблица, като използвате метода `ExtractContent`:

{{< gist "aspose-words-gists" "922a9c5d9606a0c5cf0682b4aadfaf29" "extract-content-between-block-level-nodes.h" >}}

## Извличане на съдържание между абзаците въз основа на стила

Може да се наложи да извлечете съдържанието между абзаци от едни и същи или различни стилове, например между абзаци, маркирани със заглавни стилове. Кодът по-долу показва как да се постигне това. Това е прост пример, който ще извлече съдържанието между първата инстанция на стиловете "Heading 1" и "заглавка 3", без да извлича и заглавията. За да направим това, задаваме последния параметър на невярно, което указва, че маркерните възли не трябва да бъдат включени.

При правилно изпълнение това трябва да се изпълнява в цикъл, за да се извлече съдържание между всички параграфи на тези стилове от документа. Извлеченото съдържание се копира в нов документ.

Следващият пример за код показва как да извличате съдържание между абзаци с конкретни стилове, като използвате метода `ExtractContent`:

{{< gist "aspose-words-gists" "922a9c5d9606a0c5cf0682b4aadfaf29" "extract-content-between-paragraph-styles.h" >}}

{{< gist "aspose-words-gists" "922a9c5d9606a0c5cf0682b4aadfaf29" "paragraphs-by-style-name.h" >}}

## Извличане На Съдържание Между Конкретни Серии

Можете също така да извличате съдържание между инлайн възли, като [Run](https://reference.aspose.com/words/cpp/aspose.words/run/). **Runs** от различни параграфи могат да се предават като маркери. Кодът по-долу показва как да извлечете конкретен текст между един и същ **Paragraph** възел.

Следващият пример за код показва как да извличате съдържание между конкретни серии от един и същ абзац, като използвате метода **ExtractContent**:

{{< gist "aspose-words-gists" "922a9c5d9606a0c5cf0682b4aadfaf29" "extract-content-between-runs.h" >}}

## Извличане на съдържание с помощта на поле

За да се използва поле като маркер, трябва да се премине възелът `FieldStart`. Последният параметър на метода `ExtractContent` ще определи дали цялото поле трябва да бъде включено или не. Нека извлечем съдържанието между полето за обединяване "FullName " и абзац в документа. Ние използваме [MoveToMergeField](https://reference.aspose.com/words/cpp/aspose.words/documentbuilder/movetomergefield/) метода на [DocumentBuilder](https://reference.aspose.com/words/cpp/aspose.words/documentbuilder/) клас. Това ще върне **FieldStart** възела от името на полето за обединяване, предадено към него.

В нашия случай нека зададем последния параметър, предаден на метода **ExtractContent**, за да изключим полето от екстракцията. Ние ще превърнем извлеченото съдържание в PDF.

Следният пример за код показва как да извлечете съдържание между конкретно поле и абзац в документа, като използвате метода **ExtractContent**:

{{< gist "aspose-words-gists" "922a9c5d9606a0c5cf0682b4aadfaf29" "extract-content-using-field.h" >}}

## Извличане на съдържание от отметка

В документ Съдържанието, което е дефинирано в отметка, се капсулира от възлите `BookmarkStart` и BookmarkEnd. Съдържанието, намерено между тези два възела, съставлява отметката. Можете да подавате всеки от тези възли като маркер, дори и такива от различни отметки, стига началният маркер да се показва преди крайния маркер в документа. Ще извлечем това съдържание в нов документ, като използваме кода по-долу. Опцията **IsInclusive** параметър показва как да запазите или отхвърлите отметката.

Следващият пример за код показва как да извлечете съдържанието, свързано с отметка, като използвате метода **ExtractContent**:

{{< gist "aspose-words-gists" "922a9c5d9606a0c5cf0682b4aadfaf29" "extract-content-between-bookmark.h" >}}

## Извличане на съдържание от коментар

Коментарът се състои от възли CommentRangeStart, CommentRangeEnd и коментар. Всички тези възли са вградени. Първите два възела капсулират съдържанието в документа, към който се отнася коментарът, както се вижда на екранната снимка по-долу.

Самият възел **Comment** е InlineStory, който може да съдържа абзаци и да се изпълнява. Тя представлява съобщението на коментара, както се вижда като коментар балон в екрана за визуализация. Тъй като този възел е инлайн и потомък на тяло, можете също да извлечете съдържанието от това съобщение.

Коментарът съдържа заглавието, първия параграф и таблицата във втория раздел. Нека извлечем този коментар в нов документ. Опцията **IsInclusive** диктува дали коментарът да бъде запазен или отхвърлен.

Следващият пример за код показва как да направите това:

{{< gist "aspose-words-gists" "922a9c5d9606a0c5cf0682b4aadfaf29" "extract-content-between-comment-range.h" >}}

## Как да извлечете съдържание, като използвате DocumentVisitor

Използвайте клас [DocumentVisitor](https://reference.aspose.com/words/cpp/aspose.words/documentvisitor/), за да реализирате този сценарий на използване. Този клас съответства на добре познатия дизайн на посетителите. С **DocumentVisitor,** можете да дефинирате и изпълнявате персонализирани операции, които изискват изброяване върху дървото на документа.

**DocumentVisitor**

Всеки метод **DocumentVisitor.VisitXXX** връща [VisitorAction](https://reference.aspose.com/words/net/aspose.words/visitoraction/) стойност, която контролира изброяването на възли. Можете да поискате или да продължите изброяването, да пропуснете текущия възел (но да продължите изброяването), или да спрете изброяването на възли.

Това са стъпките, които трябва да следвате, за да определите и извлечете програмно различни части от документ.:

- Създаване на клас, получен от **DocumentVisitor**
- Заместете и осигурете имплементации за някои или всички методи **DocumentVisitor.VisitXXX** за извършване на някои персонализирани операции
- Обадете се `Node.Accept` на възела, от който искате да започнете изброяването. Например, ако искате да изброите целия документ, използвайте `Document.Accept`

**DocumentVisitor**

Този пример показва как да използвате Посетителския модел, за да добавите нови операции към обектния модел Aspose.Words. В този случай създаваме прост конвертор на документи в текстов формат:

{{< gist "aspose-words-gists" "922a9c5d9606a0c5cf0682b4aadfaf29" "extract-content-using-document-visitor.h" >}}

{{< gist "aspose-words-gists" "922a9c5d9606a0c5cf0682b4aadfaf29" "convert-doc-to-txt.h" >}}

```

Можете да изтеглите примерния файл на този пример от [Aspose.Words GitHub](https://github.com/aspose-words/Aspose.Words-for-C/tree/master/Examples).

```

## Как да извлечете само текст

Начините за извличане на текст от документа са::

- Използвайте [Document.Save](https://reference.aspose.com/words/cpp/aspose.words/document/save/) с [SaveFormat.Text](https://reference.aspose.com/words/cpp/aspose.words/saveformat/), За да запишете като обикновен текст във файл или поток
- Използвайте [Node.ToString](https://reference.aspose.com/words/cpp/aspose.words/node/tostring/) и подайте параметъра **SaveFormat.Text**. Вътрешно, това извиква Запиши като текст в поток от памет и връща получения низ
- Използвайте [Node.GetText](https://reference.aspose.com/words/cpp/aspose.words/node/gettext/) за извличане на текст с всички Microsoft Word контролни знаци, включително кодовете на полетата
- Изпълнение на потребителски [DocumentVisitor](https://reference.aspose.com/words/cpp/aspose.words/documentvisitor/) за извършване на персонализирани екстракция

### Използване на `Node.GetText` и `Node.ToString`

Документ Word може да съдържа контролни знаци, които обозначават специални елементи като поле, край на клетката, край на секция и т.н. Пълният списък на възможните Word контролни знаци е дефиниран в класа [ControlChar](https://reference.aspose.com/words/cpp/aspose.words/controlchar/). Методът **Node.GetText** връща текст с всички контролни символи, присъстващи във възела.

Извикване **ToString** връща обикновен текстово представяне на документа само без контролни знаци.

Следващият пример за код показва разликата между извикването на методи **GetText** и **ToString** на възел:

{{< gist "aspose-words-gists" "922a9c5d9606a0c5cf0682b4aadfaf29" "simple-extract-text.h" >}}

### Употреба `SaveFormat.Text`

Този пример записва документа, както следва:

- Филтрира знаците на полета и кодовете на полета, фигура, бележка под линия, бележка в края и коментар препратки
- Заменя знаците в края на параграф **ControlChar.Cr** с **ControlChar.CrLf** комбинации
- Използва кодова таблица UTF8

Следващият пример за код показва как да запишете документ във формат TXT:

{{< gist "aspose-words-gists" "922a9c5d9606a0c5cf0682b4aadfaf29" "docx-to-txt.h" >}}

## Извличане на изображения от форми

Може да се наложи да извлечете изображения на документи, за да изпълните някои задачи. Aspose.Words ви позволява да направите това, както добре.

Следният пример за код показва как да извлечете изображения от документ:

{{< gist "aspose-words-gists" "922a9c5d9606a0c5cf0682b4aadfaf29" "extract-images.h" >}}
