Формат XML предназначен для хранения данных, которые могут быть полезны в работе некоторых программ, сайтов и поддержке определенных языков разметки. Создать и открыть файл в этом формате несложно. Это можно сделать, даже если на вашем компьютере не установлено специализированное программное обеспечение.
XML сам по себе является языком разметки, чем-то похожим на HTML, который используется на веб-страницах. Но если последний используется только для отображения информации и ее правильной разметки, XML позволяет структурировать ее определенным образом, что делает этот язык похожим на аналог базы данных, не требующий СУБД.
Вы можете создавать файлы XML, используя как специализированные программы, так и встроенный текстовый редактор Windows. Удобство написания кода и уровень его функциональности зависят от типа используемого программного обеспечения.
Способ 1: Visual Studio
Вместо этого редактора кода Microsoft вы можете использовать любые его аналоги от других разработчиков. Фактически, Visual Studio — это более продвинутая версия обычного Блокнота. Код теперь имеет специальную подсветку, ошибки автоматически выделяются или исправляются, а специальные шаблоны уже загружены в программу, что упрощает создание больших файлов XML.
Для начала вам необходимо создать файл. Щелкните элемент «Файл» на верхней панели и выберите «Создать…» в раскрывающемся меню. Откроется список, в котором указана запись «Файл».
Вам будет перенесено окно с выбором расширения файла, соответственно выберите пункт «XML файл».
Во вновь созданном файле уже будет первая строка с кодировкой и версией. По умолчанию записывается первая версия и кодировка UTF-8, которую вы можете изменить в любой момент. Затем, чтобы создать полный XML-файл, вам нужно записать все, что было в предыдущем операторе.
По окончании работы снова выберите в верхней панели «Файл», затем из выпадающего меню пункт «Сохранить все».
Способ 2: Microsoft Excel
Вы можете создать XML-файл без написания кода, например, используя современные версии Microsoft Excel, что позволяет сохранять таблицы с этим расширением. Однако нужно понимать, что в этом случае у вас не получится создать что-то более функциональное, чем обычный стол.
Этот метод лучше всего подходит для тех, кто не хочет или не умеет работать с кодом. Однако в этом случае пользователь может столкнуться с некоторыми проблемами при перезаписи файла в формате XML. К сожалению, преобразование обычной таблицы в XML возможно только в более новых версиях MS Excel. Для этого воспользуйтесь следующими пошаговыми инструкциями:
- Дополните таблицу некоторым содержанием.
- Нажмите кнопку «Файл» в верхнем меню.
- Откроется специальное окно, в котором нужно нажать «Сохранить как…». Этот пункт находится в левом меню.
- Укажите папку, в которой вы хотите сохранить файл. Папка указана в центре экрана.
- Теперь вам нужно указать имя файла и в разделе «Тип файла» из выпадающего меню выбрать
Данные XML». - Нажмите кнопку «Сохранить».
Способ 3: Блокнот
Даже обычный Блокнот вполне подходит для работы с XML, но у пользователя, незнакомого с синтаксисом языка, возникнут трудности, так как в нем придется писать различные команды и теги. Несколько проще и продуктивнее процесс будет в специализированных программах для редактирования кода, например, в Microsoft Visual Studio. В них есть специальные метки и подсказки, которые значительно упрощают работу человеку, не знающему синтаксиса этого языка.
Для этого метода ничего скачивать не нужно, так как в операционной системе уже есть встроенный «Блокнот». Попробуем создать простую XML-таблицу по приведенным инструкциям:
- Создайте простой текстовый документ с расширением TXT. Вы можете разместить его где угодно. Открой это.
- Начните набирать в нем первые команды. Во-первых, вам нужно установить кодировку для всего файла и указать версию XML, это делается с помощью следующей команды:
Первое значение — это версия, менять ее не нужно, а второе значение — это кодировка. Рекомендуется использовать кодировку UTF-8, так как с ней прекрасно работает большинство программ и обработчиков. Однако его можно изменить на любое другое, просто набрав желаемое имя.
- Создайте первый каталог в вашем файле, написав тег и закрыв его вот так .
- Теперь вы можете написать какой-то контент внутри этого тега. Создаем тег и даем ему любое имя, например «Иван Иванов». Готовая конструкция должна выглядеть так:
- Внутри тега теперь можно писать более подробные параметры, в данном случае это информация об определенном Иване Иванове. Мы пропишем ваш возраст и местонахождение.
- Если вы следовали инструкциям, вы должны получить тот же код, что и ниже. Когда закончите, найдите «Файл» в верхнем меню и выберите «Сохранить как…» в раскрывающемся меню. При сохранении в поле «Имя файла» после точки должно стоять расширение не TXT, а XML.
Компиляторам XML необходимо обработать этот код в виде таблицы с одним столбцом, содержащей данные о некоем Иване Иванове.
В «Блокноте» вполне можно создавать такие простые таблицы, но при создании массивов более объемных данных могут возникнуть трудности, так как в обычном «Блокноте» нет функций для исправления ошибок в коде или их выделения.
Как видите, в создании XML-файла нет ничего сложного. При желании его может создать любой пользователь, более-менее умеющий работать на компьютере. Однако для создания полного XML-файла рекомендуется изучить этот язык разметки, по крайней мере, на примитивном уровне.
Выберите файл для преобразования
Перетащите файлы сюда. Максимальный размер файла 100 МБ или зарегистрируйтесь
Вы можете перевести doc документ в xml и во множество других форматов с помощью бесплатного онлайн конвертера.
Как сконвертировать xml в doc?
Шаг 1
Загрузите doc-файл
Выберите файл, который вы хотите конвертировать с компьютера, Google Диска, Dropbox или перетащите его на страницу.
Шаг 2
Выберите «в xml»
Выберите xml или любой другой формат, в который вы хотите конвертировать файл (более 200 поддерживаемых форматов)
Шаг 3
Скачайте ваш xml файл
Подождите пока ваш файл сконвертируется и нажмите скачать xml-файл
Бесплатное онлайн преобразование doc в xml
Быстро и легко
Просто перетащите ваши файлы в формате doc на страницу, чтобы конвертировать в xml или вы можете преобразовать его в более чем 250 различных форматов файлов без регистрации, указывая электронную почту или водяной знак.
Не беспокойтесь о безопасности
Мы удаляем загруженные файлы doc мгновенно и преобразованные xml файлы через 24 часа. Все файлы передаются с использованием продвинутого шифрования SSL.
Все в облаке
Вам не нужно устанавливать какое-либо программное обеспечение. Все преобразования doc в xml происходят в облаке и не используют какие-либо ресурсы вашего компьютера.
Microsoft Word Document
Расширение файла | .doc |
Категория файла | 🔵 documents |
Программы |
🔵 Microsoft Word 🔵 OpenOffice.org Writer 🔵 IBM Lotus Symphony 🔵 Apple Pages 🔵 AbiWord |
Основная программа | 🔵 Microsoft Word |
Описание | 🔵 DOC – специальное расширение, соответствующее документам, созданным в текстовом редакторе Microsoft World, до версии 2007 года. В этом формате хранятся сведения о форматировании текстового документа – абзацы, списки, отступы, выравнивания и многое другое. Файлы DOC могут включать в себя не только текстовую информацию, но и многочисленные изображения, графики, сценарии, диаграммы. DOC представляет собой расширение в формате двоичного файла, который начинается с информационного блока, выступающего ключевым элементом всей совокупности файлов данных. Такие двоичные файлы включают в себя довольно большой объем информации о форматировании текстового документа. Традиционно расширение получило широкое распространение для создания документов текстового формата в большом диапазоне ОС. Файлы в этом формате открываются любыми, в том числе современными версиями редактора Word или его аналогами из бесплатных пакетов вроде Open Office, Libre Office или утилитами наподобие Corel WordPerfect. |
Технические детали | 🔵 Первые версии файлового формата DOC приоритетно ориентировались на содержание форматированного текста, но со временем к нему добавилось большое количество встроенных объектов, среди которых встречаются как диаграммы и графики, так и различные медиа-файлы (звуки, видео). Файлы с расширением DOC способны содержать данные о слиянии, благодаря чему шаблон обработки слов может применяться вместе с таблицей либо базой данных. |
Разработчик | 🔵 Microsoft |
MIME type |
🔵 application/msword 🔵 application/kswps |
Extensible Markup Language
Расширение файла | .xml |
Категория файла | 🔵 documents |
Программы |
🔵 Microsoft Visual Studio 2013 🔵 JAPISoft EditiX 🔵 Wattle XMLwriter 🔵 MacroMates TextMate |
Описание | 🔵 XML — это формат файла, содержащий язык разметки. И люди, и компьютеры могут получить доступ к этому формату файла, который предназначен для хранения данных. Здесь вы можете независимо использовать языки и установить свой собственный тег. Он достаточно портативен и практически не зависит от поставщика, который представил этот формат как простой в использовании и сделал его очень популярным на онлайн-платформе. XML также важен как и HTML. |
Технические детали | 🔵 Каждый XML-файл имеет корневую структуру, с помощью которой пользователи могут устанавливать свои собственные теги. Каждый отдельный XML-файл начинается с объявления XML. XML-декларация имеет свое имя, версии и кодировку этого конкретного файла. После этого определяется Базовый элемент, называемый корневым элементом. Корневой элемент может иметь дочерние элементы. Все теги имеют свой собственный конечный тег. XML-файлы могут содержать комментарии, ссылки на объекты и атрибуты. Приложения могут считывать значения и отображать нужные пользователям данные. |
Разработчик | 🔵 World Wide Web Consortium |
MIME type |
🔵 application/xml 🔵 application/x-xml 🔵 text/xml |
FAQ
❓ Как я могу конвертировать doc в xml?
Во-первых, выберите doc файл, который вы хотите конвертировать или перетащить его. Во-вторых, выберите xml или любой другой формат, в который вы хотите преобразовать файл. Затем нажмите кнопку конвертировать и подождите, пока файл не преобразуется
⏳ Как долго я должен ждать, чтобы преобразовать doc в xml?
Преобразование Изображение обычно занимает несколько секунд. Вы преобразовать doc в xml очень быстро.
🛡️ Это безопасно конвертировать doc в xml на OnlineConvertFree?
Конечно! Мы удалить загруженные и преобразованные файлы, так что никто не имеет доступ к вашей информации. Все типы преобразования на OnlineConvertFree (в том числе doc в xml) 100% безопасны.
📱 Можно ли преобразовать doc в xml без установки программного обеспечения?
Да! OnlineConvertFree не требует установки. Вы можете конвертировать любые файлы (в том числе doc в xml) онлайн на вашем компьютере или мобильном телефоне.
Один из форматов, в которых вы можете сохранять документы Word, — это формат XML. Команды XML упрощают обмен информацией между программами, поскольку они содержат не только данные документа, но и описание их форматирования, включая способ организации в документе. Любая другая программа, поддерживающая формат XML, может работать с данными, так как она получает информацию о форматировании и организации данных из встроенных команд XML.
Чтобы сохранить документ в формате XML, выполните следующие действия:
1. Выберите
в меню Файл пункт Сохранить как (Save As).
2. В диалоговом окне Сохранение файла выберите в раскрывающемся списке Тип файла (Save as Туре) пункт XML-документ (XML Document). Введите имя файла и папку, где он будет сохранен (рис. 10.20).
3. Если вы желаете отменить форматирование документа в Word и обмениваться с другими программами только базовыми данными, поставьте флажок в поле Сохранить только данные (Save Data Only).
4. Щелкните по кнопке Сохранить.
Сохранять документ в формате XML нужно только в том случае, если в вашей компании практикуется обмен информацией с другими пользователями.
Дополнительную информацию о формате XML вы найдете в книге «Истинный мир формата XML» Стива Хользнера (Steve Holzner) издательства Peachpit Press.
Newer news items:
- —
- —
- —
- —
- —
Older news items:
- —
- —
- —
- —
- —
.docx Конвертер DOCX
Расширение файла DOCX лучше всего известно для его использования в Microsoft Word, мощным процессоре Word, которое дает пользователям возможность создавать и обмениваться документами. Файлы DOCX имеют открытую схему форматирования XML для большей совместимости и сжатия ZIP, что приводит к меньшим файлам.
.xml Конвертер XML
Расширяющийся язык разметки (XML) — это язык разметки, который определяет правила для кодирования документов в формате, который является как читаемой человеком, так и для машиночитаемого. XML — это текстовый формат данных с сильной поддержкой через Unicode для разных человеческих языков.
Преимущества конвертера DOCX в XML
Из DOCX в XML онлайн
Вам не нужно скачивать и устанавливать какое-либо ПО, чтобы перевести docx в xml. Конвертирование DOCX в XML происходит в облаке.
Файлы под защитой
Ваши файлы защищены и доступны только вам. Все файлы будут безвозвратно удалены в течение 2 часов после конвертации.
Быстро и бесплатно
Преобразуйте ваши docx-файлы в формат xml в 2 клика. И ничего за это не платите! Наш конвертер DOCX в XML бесплатен для всех пользователей.
Рейтинг качества конвертера DOCX в XML
⭐ ⭐ ⭐ ⭐ ⭐ ⭐ ⭐ ⭐ ⭐
Оценка 9.36/10 на основе 66235 отзывов
Вы можете оценить конвертер после преобразования файла
Время на прочтение
10 мин
Количество просмотров 9.9K
Продолжаю свой цикл статей, посвященный конвертации различных текстовых файлов с помощью решений, реализованных на языке C#.
С момента моей последней публикации «Конвертация xls в xlsx и xml на C#» прошло более полугода, за которые я успел сменить как работодателя, так и пересмотреть свои взгляды на некоторые аспекты коммерческой разработки. Сейчас, работая в международной компании с совершенно иным подходом к разработке ПО (ревью кода, юнит-тестирование, команда автотестеров, строгое соблюдение СМК, заботливый менеджер, очаровательная HR и прочие корпоративные плюшки), я начинаю понимать, почему некоторые из комментаторов интересовались целесообразностью предлагаемых мной велокостылей, когда на рынке есть очень достойные готовые решения, например, от e-iceblue. Но давайте не забывать, что ситуации бывают разные, компании – тем более, и если потребность в решении какой-то задачи с использованием определенного инструментария возникла у одного человека, то со значительной долей вероятности она возникнет и у другого.
Итак, дано:
- Неопределенное множество файлов в формате .doc, которые нужно конвертировать в xml (например, для парсинга и организации автоматизированной навигации внутри текста), желательно с сохранением форматирования.
- На сервере памяти чуть больше, чем у рыбки, а на процессоре уже можно жарить яичницу, да и у компании нет лишней лицензии на Word, поэтому конвертация должна происходить без запуска каких-либо офисных приложений.
- Сервис должен быть написан на языке C# и в последующем интегрирован в код другого продукта.
- На решение задачи два дня и две ночи, которые истекли вчера.
Поехали!
- Во-первых, нужно сразу уяснить, что старые офисные форматы файлов, такие как .doc и .xls, являются бинарными, и достать что-нибудь человекочитаемое из них без использования текстовых редакторов/процессоров не получится. Прочитать об этом можно в официальной документации. Если есть желание поковыряться поглубже, посчитать нолики с единичками и узнать, что они означают, то лучше сразу перейти сюда.
- Во-вторых, несмотря на наличие бесплатных решений для работы с .doc, большинство из них написаны на Python, Ruby и чем угодно еще, но не C#.
- В-третьих, найденное мной решение, а именно библиотека b2xtranslator, является единственным доступным бесплатным инструментом такого рода, еще и написана при поддержке Microsoft, если верить вот этому источнику. Если вдруг вы встречали какие-нибудь аналоги данной библиотеки, пожалуйста, напишите об этом в комментариях. Даже это душеспасительное решение не превратит .doc в .xml, однако поможет нам превратить его в .docx, с которым мы уже умеем работать.
Довольно слов – давайте к делу
Установка b2xtranslator
Для работы нам понадобиться библиотека b2xtranslator. Ее можно подключить через менеджера пакетов NuGet.
Однако я настоятельно рекомендую скачать ее из официального git-репозитория по следующим причинам:
- a) Библиотека представляет собой комбайн, работающий с различными бинарными офисными документами (.doc, .xls, .ppt), что может быть избыточным
- b) Проект достаточно долго не обновляется и вам, возможно, придется доработать его напильником
- c) Задача, с которой я столкнулся, как раз потребовала внесения некоторых изменений в работу библиотеки, а также изучения ее алгоритмов и используемых структур для успешной интеграции в свое решение
Для дальнейшей работы нам понадобиться подключить в свое решение два проекта из библиотеки: b2xtranslatorCommonb2xtranslator.csproj и b2xtranslatorDocb2xtranslator.doc.csproj
Конвертация .doc в .docx
Конвертация документов строится по следующему алгоритму:
1. Инициализация дескриптора для конвертируемого файла.
Для этого необходимо создать экземпляр класса StructuredStorageReader
, конструктор которого в качестве аргумента может принимать или путь до файла, или последовательность байтов (Stream), что делает его крайне удобным при работе с файлами, загружаемыми по сети. Также обращаю внимание, что так как библиотека b2xtranslator является комбайном для конвертации бинарных офисных форматов в современный OpenXML, то независимо от того, какой формат мы хотим конвертировать (.ppt, .xls или .doc) инициализация дескриптора всегда будет происходить с помощью указанного класса (StructuredStorageReader).
StructuredStorageReader reader = new StructuredStorageReader(docPath);
2. Парсинг бинарного .doc файла с помощью объекта класса WordDocument, конструктор которого в качестве аргумента принимает объект типа StructuredStorageReader.
WordDocument doc = new WordDocument(reader);
3. Создание объекта, который будет хранить данные для файла в формате .docx.
Для этого используется статический метод cs public static WordprocessingDocument Create(string fileName, OpenXmlPackage.DocumentType type)
класса WordprocessingDocument
. В первом аргументе указываем имя нового файла (вместе с путем), а вот во втором мы должны выбрать тип файла, который должен получиться на выходе:
- a. Document (обычный документ с расширением .docx);
- b. MacroEnabledDocument (файл, содержащий макросы, с расширением .docm);
- c. Template (файл шаблонов word с расширением .dotx);
- d. MacroEnabledTemplate (файл с шаблоном word, содержащий макросы. Имеет расширение .dotm).
WordprocessingDocument docx = WordprocessingDocument.Create(docxPath, DocumentType.Document);
4. Конвертация данных из бинарного формата в формат OpenXML и их запись в объект типа WordprocessingDocument
.
За выполнение указанной процедуры отвечает статический метод
public static void Convert(WordDocument doc, WordprocessingDocument docx)
класса Converter
, который заодно и записывает получившийся результат в файл.
Converter.Convert(doc, docx);
В результате у вас должен получиться вот такой код:
using b2xtranslator.StructuredStorage.Reader;
using b2xtranslator.DocFileFormat;
using b2xtranslator.OpenXmlLib.WordprocessingML;
using b2xtranslator.WordprocessingMLMapping;
using static b2xtranslator.OpenXmlLib.OpenXmlPackage;
namespace ConverterToXml.Converters
{
public class DocToDocx
{
public void ConvertToDocx(string docPath, string docxPath)
{
StructuredStorageReader reader = new StructuredStorageReader(docPath);
WordDocument doc = new WordDocument(reader);
WordprocessingDocument docx = WordprocessingDocument.Create(docxPath, DocumentType.Document);
Converter.Convert(doc, docx);
}
}
}
Внимание!
Если вы используете платформу .Net Core 3 и выше в своем решении, обратите внимание на целевые среды для подключенных проектов b2xtranslator. Так как библиотека была написана довольно давно и не обновляется с 2018 года, по умолчанию она собирается под .Net Core 2.
Чтобы сменить целевую среду, щелкните правой кнопкой мыши по проекту, выберите пункт «Свойства» и поменяйте целевую рабочую среду. В противном случае вы можете столкнуться с проблемой невозможности конвертации файлов .doc, содержащих в себе таблицы.
Я не стал разбираться, почему так происходит, но энтузиастам могу подсказать, что причину стоит искать в 40 строчке файла «~b2xtranslatorDocWordprocessingMLMappingMainDocumentMapping.cs» в момент обработки таблицы.
Кроме того, рекомендую собирать все проекты и само решение под 64-битную платформу во избежание всяких непонятных ошибок.
Сохранение результата в поток байтов
Так как моей целью при использовании данного решения была конвертация .doc в .xml, а не в .docx, предлагаю вовсе не сохранять промежуточный OpenXML файл, а записать его в виде потока байтов. К сожалению, b2xtranslator не предоставляет нам подходящих методов, но это довольно легко исправить:
В абстрактном классе OpenXmlPackage
(см. ~b2xtranslatorCommonOpenXmlLibOpenXmlPackage.cs) давайте создадим виртуальный метод:
public virtual byte[] CloseWithoutSavingFile()
{
var writer = new OpenXmlWriter();
MemoryStream stream = new MemoryStream();
writer.Open(stream);
this.WritePackage(writer);
writer.Close();
byte[] docxStreamArray = stream.ToArray();
return docxStreamArray;
}
По большому счету, данный метод будет заменять собой метод Close()
. Вот его исходный код:
public virtual void Close()
{
// serialize the package on closing
var writer = new OpenXmlWriter();
writer.Open(this.FileName);
this.WritePackage(writer);
writer.Close();
}
Скажем спасибо разработчикам библиотеки за то, что не забыли перегрузить метод Open()
, который может принимать или имя файла, или поток байтов. Однако, библиотечный метод Close()
, который как раз и отвечает за запись результата в файл, вызывается в методе Dispose()
в классе OpenXmlPackage
. Чтобы ничего лишнего не поломать и не заморачиваться с архитектурой фабрик (тем более в чужом проекте), я предлагаю просто закомментировать код внутри метода Dispose()
и вызвать метод CloseWithoutSavingFile()
, но уже внутри нашего метода после вызова Converter.Convert(doc, docx)
.
Для сохранения результата конвертации вызываем вместо docx.Close()
метод docx.CloseWithoutSavingFile()
:
public MemoryStream ConvertToDocxMemoryStream(Stream stream)
{
StructuredStorageReader reader = new StructuredStorageReader(stream);
WordDocument doc = new WordDocument(reader);
var docx = WordprocessingDocument.Create("docx", DocumentType.Document);
Converter.Convert(doc, docx);
return new MemoryStream(docx.CloseWithoutSavingFile());
}
Теперь библиотека b2xtranslator будет возвращать сконвертированный из формата .doc в .docx файл в виде потока байтов. Даже если у вас нет цели получить на выходе .xml, такой метод может оказаться более подходящим для дальнейшей работы с файлами, тем более что стрим всегда можно сохранить в виде файла там, где вам надо.
Для тех, кому все-таки очень хочется получить на выходе .xml документ, еще и с сохраненной структурой, предлагаю дойти до кухни, сварить кофе покрепче, добавить в него рюмку коньяка и приготовиться к приключению на 20 минут.
Конвертация .doc в .xml
Теперь, когда, казалось бы, можно воспользоваться классом-конвертором DocxToXml, работа которого была описана вот в этой статье, нас поджидает сюрприз, связанный с особенностями работы b2xtranslator.
Давайте посмотрим на результат работы библиотеки повнимательнее и сравним с оригинальным .docx файлом, из которого был экспортирован .doc файл для конвертации. Для этого достаточно изменить расширение сравниваемых файлов с .docx на .zip. Вот отличия, которые мы увидим, заглянув внутрь архивов:
1. В результате конвертации в новом .docx файле (справа) отсутствуют папки customXml и docProps.
2. Внутри папки word, мы также найдем определенные отличия, перечислять которые я, конечно же, не буду:
3. Естественно, что и метаданные, по которым осуществляется навигация внутри документа, также отличаются. Например, на представленном скрине и далее оригинальный .docx слева, сгенерированный b2xtranslator – cправа.
Налицо явное отличие в атрибутах тега “w:document”
, но этим отличия не заканчиваются. Всю «мощь» библиотеки мы ощутим, когда захотим обработать списки и при этом:
- a. Сохранить их нумерацию
- b. Не потерять структуру вложенности
- c. Отделить один список от другого
Давайте сравним файлы document.xml для вот этого списка:
1.1 Первый.Первый
1.2 Первый.Второй
1.2.1 Первый.Второй.Первый
1.2.2 Первый.Второй.Второй
Какая-то строчка
1.2.3 Первый.Второй.Третий
2. Второй
2.1 Второй.Первый
Вот так будет выглядеть .xml для первого элемента списка.
-Во-первых, мы видим, что сама структура документов несколько отличается (например, точка внутри строк рассматривается как отдельный элемент, что, как оказалось, совсем не страшно).
-Во-вторых, у тегов остался только один атрибут (w:rsidR
), а вот w:rsidR
, w14:textId
, w:rsidRDefault
, w:paraId
и w:rsidP
пропали. Все эти особенности приводят к тому, что наш класс-конвертер DocxToXml
(про него подробно можно почитать здесь) подавится и поднимет лапки вверх с ошибкой NullReferenceException
, что указывает на отсутствие индексирования параграфов внутри документа.
Вместе с тем, если мы попытаемся такой файл отрыть в Word, то увидим, что все хорошо отображается, а таблицы и списки покоятся на своих местах! Магия!
В общем, когда в поисках решения я потратил N часов на чтение документации, мои красные от дебагера глаза омылись горькими слезами, а один лишь запах кофе стремился показать коллегам мой дневной рацион, решение было найдено!
Исходя из документации к формату doc и алгоритмов работы b2xtranslator, можно сделать вывод, что исторически в бинарных офисных текстовых документах отсутствовала индексация по параграфам*. Возникает задача расставить необходимые теги в нужных местах.
За индекс параграфа отвечает атрибут тега paraId
, о чем прямо написано здесь. Данный атрибут относится к пространству имен w14
, о чем можно догадаться при изучении document.xml из архива .docx. В принципе, на скринах выше вы это тоже видите. Объявление пространства имен в .xml выглядит так:
xmlns:wp14="http://schemas.microsoft.com/office/word/2010/wordprocessingDrawing"
Теперь давайте заставим b2xtranslator добавлять это пространство имен и идентификатор каждому параграфу. Для этого в файле “~b2xtranslatorCommonOpenXmlLibContentTypes.cs” после 113 строки добавим вот эту строчку:
public const string WordprocessingML2010 = "http://schemas.microsoft.com/office/word/2010/wordml";
Кстати, если посмотрите на комментарии в коде, то увидите, что в этом блоке как раз располагаются поддерживаемые пространства имен для вордовых документов:
Далее наша задача – заставить библиотеку вставлять в начало файла ссылку на данное пространство имен. Для этого в файле “~b2xtranslatorDocWordprocessingMLMappingMainDocumentMapping.cs” в 24 строке вставим код:
this._writer.WriteAttributeString("xmlns", "w14", null, OpenXmlNamespaces.WordprocessingML2010);
Разработчики библиотеки также позаботились о документации:
Теперь дело за малым – заставить b2xtranslator индексировать параграфы. В качестве индексов предлагаю использовать рандомно сгенерированные GUID – может быть, это несколько тяжеловато, но зато надежно!
Переходим в файл “~b2xtranslatorDocWordprocessingMLMappingDocumentMapping.cs” и в 504 и 505 строки вставляем вот этот код:
this._writer.WriteAttributeString("w14", "paraId", OpenXmlNamespaces.WordprocessingML2010, Guid.NewGuid().ToString());
this._writer.WriteAttributeString("w14", "textId", OpenXmlNamespaces.WordprocessingML2010, "77777777");
Что касается второй строчки, в которой мы добавляем каждому тегу параграфа атрибут w14:textId = "77777777"
, то тут можно лишь сказать, что без этого атрибута ничего работать не будет. Для пытливых умов вот ссылка на документацию.
Если серьезно, то, как я понимаю, атрибут используется, когда текст разделен на разные блоки, внутри которых происходит индексация тегов, которые могут иметь одинаковый Id внутри одного документа. Видимо, для этих случаев используется дополнительная индексация текстовых блоков. Однако, так как мы используем GUID, который в несколько раз больше индексов, используемых в вордовских документах по умолчанию, то генерацией отдельных индексов для текстовых блоков можно и пренебречь.
Вот теперь мы получили .docx-файл, пригодный для дальнейшего преобразования в .xml. Подробнее о том, как работать с ним дальше, вы можете прочитать в этой статье или воспользоваться уже выложенным на github-решением.
В заключение, если у вас на проекте есть возможность воспользоваться платным надежным софтом, то этот путь скорее всего не для вас. Однако же, если вы энтузиаст, пишете свой pet-проект и уважительно относитесь к авторским правам, а также если ваш проект находится в стадии прототипирования и пока не готов к покупке дорогостоящих лицензий, а разработку продолжать надо, то, мне кажется, этот вариант может вам очень даже подойти! Тем более, что у вас есть возможность воспользоваться готовым решением и не заливать свои краснющие зенки визином, изучая документацию и особенности работы некоторых, на первый взгляд, сомнительных решений.
Наконец, бонус для тех, кто хочет разобраться, что значат все эти бесконечные теги и их атрибуты в документах .docx и как они мапаются на бинарный .doc: советую заглянуть в файл “~b2xtranslatorDocDocFileFormatCharacterProperties.cs”, а также посмотреть спецификацию для docx и doc.