Форум программистов, компьютерный форум, киберфорум
C# для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.67/6: Рейтинг темы: голосов - 6, средняя оценка - 4.67
1 / 1 / 0
Регистрация: 15.12.2018
Сообщений: 260

Парсинг docx документа

21.12.2021, 21:46. Показов 1350. Ответов 11
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Ситуация такая: есть парсер, который парсит docx библиотекой documentformat.openxml. Парсинг берёт все "раны" (теги в xml, в которых располагаются куски текста по разным стилям) и заменяет определенный текст на нужные данные. Возможно, выбрана не та библиотека, но тогда мне нужна подсказка, потому что сейчас происходит нечто невообразимое: т.к. парсинг работает с xml, соответственно создавать и редактировать документ можно только в xml, потому что набирать текст в docx - значит стрелять себе в ногу, ибо этот самый текст располагается в "ранах" непредсказуемо, т.е. даже одно слово может располагаться в разных "ранах" и парсинг не может заменить текст в этих ранах. Но это пол беды, потому что даже если весь текст был написан через xml и все раны сформированы руками, то при редактировании (например, постановка пробела в любой части документа) текст word вновь формирует ВЕСЬ ТЕКСТ документа в свои созданные раны и опять всё по новой. Есть люди, которые каким-то другим образом формируют документы на основе шаблонов, какой метод можно использовать, потому что этот потихоньку сводит меня с ума
0
Лучшие ответы (1)
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
21.12.2021, 21:46
Ответы с готовыми решениями:

Парс таблиц из документа docx
Уже создавал тему, решением стала библиотека docx Щас не могу разобраться, как спарсить таблицу? В документе есть одна простая...

Парсинг xml документа
Имеется документ типа <?xml version="1.0" encoding="utf-8" standalone="yes"?> <data> <users> <user> ...

Парсинг текстового документа?
Всем привет! Подскажите пожалуйста, как можно реализовать парсинг текстового документа? В нëм данные идут через : на 3 части (1...

11
Эксперт .NET
 Аватар для Usaga
14314 / 9399 / 1355
Регистрация: 21.01.2016
Сообщений: 35,439
22.12.2021, 07:33
Ziltoid Townsen, тут проблема в тупом парсере, а не в Word'е или используемой библиотеке. С точки зрения содержимого, а не стилей, произвольная последовательность run'ов является одной строкой и парсер их так и должен рассматривать. Если так будет удобнее, то соседние run'ы с одним набором атрибутов можно смело объединять в один, если Word это нормально воспринимает.

Так что это вопрос прямоты рук программиста писавшего парсер. documentformat.openxml тут ни причём.
0
1 / 1 / 0
Регистрация: 15.12.2018
Сообщений: 260
22.12.2021, 08:57  [ТС]
Цитата Сообщение от Usaga Посмотреть сообщение
С точки зрения содержимого, а не стилей, произвольная последовательность run'ов является одной строкой и парсер их так и должен рассматривать.
Как тогда необходимо парсить текст? На данный момент это происходит так:
C#
1
 var texts = doc.MainDocumentPart.Document.Descendants<Text>().ToList();
0
Эксперт .NET
 Аватар для Usaga
14314 / 9399 / 1355
Регистрация: 21.01.2016
Сообщений: 35,439
22.12.2021, 09:15
Лучший ответ Сообщение было отмечено Pilarentes как решение

Решение

Ziltoid Townsen, не уверен, что вы осилите такую задачу.

Один из вариантов: завести некий класс TextRunnerString, который будет представлять из себя абстрактную строку. Этот класс будет содержать список объектов Text, а так же набор методов для поиска и замены строк (или других манипуляций со строкой). Поиск подстроки или слова, в этом классе, будет идти по связному списку (надеюсь знаете что такое?) из объектов Text. Замена слова, что пересекает границу раннера - выкусывание его самой левой части и замена на полное слово в самом правом раннере.

Я очень сомневаюсь, что вы вообще поняли что я советую) Посмотрите код класса StringBuilder. Он под капотом нечто похожее делает. У него там коллекция массивов символов, кажется по 8К элементов каждый, и он умеет выполнять различные манипуляции с этим делом, чтобы в конце получить целую строку.
0
1 / 1 / 0
Регистрация: 15.12.2018
Сообщений: 260
22.12.2021, 09:43  [ТС]
Цитата Сообщение от Usaga Посмотреть сообщение
Замена слова, что пересекает границу раннера - выкусывание его самой левой части и замена на полное слово в самом правом раннере.
В итоге, левая часть должна остаться пустой, как-то так?
0
Эксперт .NET
 Аватар для Usaga
14314 / 9399 / 1355
Регистрация: 21.01.2016
Сообщений: 35,439
22.12.2021, 09:56
Ziltoid Townsen, не пустой. Я бы просто убрал упоминание слова, что пересекает несколько раннеров, из всех ранныеров, кроме одного. Чтобы не придумывать, как новое слово разбить, чтобы так же раскидать по раннерам.
0
1 / 1 / 0
Регистрация: 15.12.2018
Сообщений: 260
22.12.2021, 10:03  [ТС]
Цитата Сообщение от Usaga Посмотреть сообщение
Я бы просто убрал упоминание слова, что пересекает несколько раннеров, из всех ранныеров, кроме одного.
Вот это прям очень сложно понять. Что такое "упоминание слова"? Как оно может пересекать несколько раннеров и находится не в одном раннере???
0
Эксперт .NET
 Аватар для Usaga
14314 / 9399 / 1355
Регистрация: 21.01.2016
Сообщений: 35,439
22.12.2021, 10:09
Цитата Сообщение от Ziltoid Townsen Посмотреть сообщение
Как оно может пересекать несколько раннеров и находится не в одном раннере???
Вы же сами это сказали:

Цитата Сообщение от Ziltoid Townsen Посмотреть сообщение
даже одно слово может располагаться в разных "ранах"
Или я не так понял?
0
1 / 1 / 0
Регистрация: 15.12.2018
Сообщений: 260
22.12.2021, 10:11  [ТС]
Цитата Сообщение от Usaga Посмотреть сообщение
Вы же сами это сказали:
Возможно и я не так понял. В общем. Вы говорите, что нужно "склеивать" раны, в рамках которых расположено нужное слово в один ран, правильно я понял?
0
Эксперт .NET
 Аватар для Usaga
14314 / 9399 / 1355
Регистрация: 21.01.2016
Сообщений: 35,439
22.12.2021, 10:17
Ziltoid Townsen, агась. Только нужно точно знать, что атрибуты этих ранов совпадают. Если различаются, то так сделать будет нельзя и слово придётся удалять из всех ранов, кроме одного.

Вот представьте себе такой текст:
Привет.

Тут слово состоит из трёх "ранов":
Code
1
[COLOR="DarkOrange"]Пр[/COLOR][COLOR="Lime"]ив[/COLOR][COLOR="Red"]ет.[/COLOR]
Такие раны в один склеить не можно, ибо у них разные атрибуты. Придётся перенести слово в одни из ранов.
0
1 / 1 / 0
Регистрация: 15.12.2018
Сообщений: 260
22.12.2021, 10:23  [ТС]
Цитата Сообщение от Usaga Посмотреть сообщение
Только нужно точно знать, что атрибуты этих ранов совпадают.
Да, понял теперь. А пустые раны же можно удалять? Они бесследно исчезнут?
0
Эксперт .NET
 Аватар для Usaga
14314 / 9399 / 1355
Регистрация: 21.01.2016
Сообщений: 35,439
22.12.2021, 14:37
Попробуйте)
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
22.12.2021, 14:37
Помогаю со студенческими работами здесь

Парсинг ссылок из HTML документа
Вот такой код нашел на просторах интернета: List links = new List(); foreach (HtmlElement link in webBrowserDocument.Links) { ...

Парсинг большого XML документа
Доброго времени суток! Помогите пожалуйста спарсить XML файл такого рода. Вот его кусочек: &lt;Tools&gt; &lt;CatalogTool&gt; ...

Парсинг списка из html документа
Подскажите пожалуйста. Имеется HTML станичка, в которой есть список из множесмтва элементов (до тысячи) &lt;option value=&quot;&quot; ...

Парсинг с текстового документа в текстбокс
Крч, нужно. что бы из текстового файла парсились данные в текстбокс, как сделать, если возможно.

Парсинг XML документа со сложной структурой
Доброго времени суток. Возникла проблема с парсингом .osm файла. Для чтения документа решил использовать xmlReader, т.к. он лучше всего...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
12
Ответ Создать тему
Новые блоги и статьи
Доступность команды формы по условию
Maks 07.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "СписаниеМатериалов", разработанного в конфигурации КА2. Задача: сделать доступной кнопку (команда формы "ЗавершитьСписание") при. . .
Уведомление о неверно выбранном значении справочника
Maks 06.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "НарядПутевка", разработанного в конфигурации КА2. Задача: уведомлять пользователя, если в документе выбран неверный склад. . .
Установка Qt Creator для C и C++: ставим среду, CMake и MinGW без фреймворка Qt
8Observer8 05.04.2026
Среду разработки Qt Creator можно установить без фреймворка Qt. Есть отдельный репозиторий для этой среды: https:/ / github. com/ qt-creator/ qt-creator, где можно скачать установщик, на вкладке Releases:. . .
AkelPad-скрипты, структуры, и немного лирики..
testuser2 05.04.2026
Такая программа, как AkelPad существует уже давно, и также давно существуют скрипты под нее. Тем не менее, прога живет, периодически что-то не спеша дополняется, улучшается. Что меня в первую очередь. . .
Отображение реквизитов в документе по условию и контроль их заполнения
Maks 04.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "ПланированиеСпецтехники", разработанного в конфигурации КА2. Данный документ берёт данные из другого нетипового документа. . .
Фото всей Земли с борта корабля Orion миссии Artemis II
kumehtar 04.04.2026
Это первое подобное фото сделанное человеком за 50 лет. Снимок называют новым вариантом легендарной фотографии «The Blue Marble» 1972 года, сделанной с борта корабля «Аполлон-17». Новое фото. . .
Вывод диалогового окна перед закрытием, если документ не проведён
Maks 04.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "СписаниеМатериалов", разработанного в конфигурации КА2. Задача: реализовать программный контроль на предмет проведения документа. . .
Программный контроль заполнения реквизитов табличной части документа
Maks 02.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "СписаниеМатериалов", разработанного в конфигурации КА2. Задача: 1. Реализовать контроль заполнения реквизита. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru