Задача обработки документов в формате docx, а также таблиц xlsx и презентаций pptx является весьма нетривиальной. В этой статье расскажу как научиться парсить, создавать и обрабатывать такие документы используя только XSLT и ZIP архиватор.
Зачем?
docx — самый популярный формат документов, поэтому задача отдавать информацию пользователю в этом формате всегда может возникнуть. Один из вариантов решения этой проблемы — использование готовой библиотеки, может не подходить по ряду причин:
- библиотеки может просто не существовать
- в проекте не нужен ещё один чёрный ящик
- ограничения библиотеки по платформам и т.п.
- проблемы с лицензированием
- скорость работы
Поэтому в этой статье будем использовать только самые базовые инструменты для работы с docx документом.
Структура docx
Для начала разоберёмся с тем, что собой представляет docx документ. docx это zip архив который физически содержит 2 типа файлов:
- xml файлы с расширениями xml и rels
- медиа файлы (изображения и т.п.)
А логически — 3 вида элементов:
- Типы (Content Types) — список типов медиа файлов (например png) встречающихся в документе и типов частей документов (например документ, верхний колонтитул).
- Части (Parts) — отдельные части документа, для нашего документа это document.xml, сюда входят как xml документы так и медиа файлы.
- Связи (Relationships) идентифицируют части документа для ссылок (например связь между разделом документа и колонтитулом), а также тут определены внешние части (например гиперссылки).
Они подробно описаны в стандарте ECMA-376: Office Open XML File Formats, основная часть которого — PDF документ на 5000 страниц, и ещё 2000 страниц бонусного контента.
Минимальный docx
Простейший docx после распаковки выглядит следующим образом
Давайте посмотрим из чего он состоит.
[Content_Types].xml
Находится в корне документа и перечисляет MIME типы содержимого документа:
_rels/.rels
Главный список связей документа. В данном случае определена всего одна связь — сопоставление с идентификатором rId1 и файлом word/document.xml — основным телом документа.
word/document.xml
- — сам документ
- — тело документа
- — параграф
- — run (фрагмент) текста
- — сам текст
- — описание страницы
Если открыть этот документ в текстовом редакторе, то увидим документ из одного слова Test .
word/_rels/document.xml.rels
Здесь содержится список связей части word/document.xml . Название файла связей создаётся из названия части документа к которой он относится и добавления к нему расширения rels . Папка с файлом связей называется _rels и находится на том же уровне, что и часть к которой он относится. Так как связей в word/document.xml никаких нет то и в файле пусто:
Даже если связей нет, этот файл должен существовать.
docx и Microsoft Word
docx созданный с помощью Microsoft Word, да в принципе и с помощью любого другого редактора имеет несколько дополнительных файлов.
Вот что в них содержится:
- docProps/core.xml — основные метаданные документа согласно Open Packaging Conventions и Dublin Core [1], [2].
- docProps/app.xml — общая информация о документе: количество страниц, слов, символов, название приложения в котором был создан документ и т.п.
- word/settings.xml — настройки относящиеся к текущему документу.
- word/styles.xml — стили применимые к документу. Отделяют данные от представления.
- word/webSettings.xml — настройки отображения HTML частей документа и настройки того, как конвертировать документ в HTML.
- word/fontTable.xml — список шрифтов используемых в документе.
- word/theme1.xml — тема (состоит из цветовой схемы, шрифтов и форматирования).
В сложных документах частей может быть гораздо больше.
Реверс-инжиниринг docx
Итак, первоначальная задача — узнать как какой-либо фрагмент документа хранится в xml, чтобы потом создавать (или парсить) подобные документы самостоятельно. Для этого нам понадобятся:
- Архиватор zip
- Библиотека для форматирования XML (Word выдаёт XML без отступов, одной строкой)
- Средство для просмотра diff между файлами, я буду использовать git и TortoiseGit
Инструменты
Также понадобятся скрипты для автоматического (раз)архивирования и форматирования XML.
Использование под Windows:
- unpack file dir — распаковывает документ file в папку dir и форматирует xml
- pack dir file — запаковывает папку dir в документ file
Использование под Linux аналогично, только ./unpack.sh вместо unpack , а pack становится ./pack.sh .
Использование
Поиск изменений происходит следующим образом:
- Создаём пустой docx файл в редакторе.
- Распаковываем его с помощью unpack в новую папку.
- Коммитим новую папку.
- Добавляем в файл из п. 1. изучаемый элемент (гиперссылку, таблицу и т.д.).
- Распаковываем изменённый файл в уже существующую папку.
- Изучаем diff, убирая ненужные изменения (перестановки связей, порядок пространств имён и т.п.).
- Запаковываем папку и проверяем что получившийся файл открывается.
- Коммитим изменённую папку.
Пример 1. Выделение текста жирным
Посмотрим на практике, как найти тег который определяет форматирование текста жирным шрифтом.
- Создаём документ bold.docx с обычным (не жирным) текстом Test.
- Распаковываем его: unpack bold.docx bold .
- Коммитим результат.
- Выделяем текст Test жирным.
- Распаковываем unpack bold.docx bold .
- Изначально diff выглядел следующим образом:
Рассмотрим его подробно:
docProps/app.xml
Изменение времени нам не нужно.
docProps/core.xml
Изменение версии документа и даты модификации нас также не интересует.
word/document.xml
Изменения в w:rsidR не интересны — это внутренняя информация для Microsoft Word. Ключевое изменение тут
в параграфе с Test. Видимо элемент и делает текст жирным. Оставляем это изменение и отменяем остальные.
word/settings.xml
Также не содержит ничего относящегося к жирному тексту. Отменяем.
7 Запаковываем папку с 1м изменением (добавлением ) и проверяем что документ открывается и показывает то, что ожидалось.
8 Коммитим изменение.
Пример 2. Нижний колонтитул
Теперь разберём пример посложнее — добавление нижнего колонтитула.
Вот первоначальный коммит. Добавляем нижний колонтитул с текстом 123 и распаковываем документ. Такой diff получается первоначально:
Сразу же исключаем изменения в docProps/app.xml и docProps/core.xml — там тоже самое, что и в первом примере.
[Content_Types].xml
footer явно выглядит как то, что нам нужно, но что делать с footnotes и endnotes? Являются ли они обязательными при добавлении нижнего колонтитула или их создали заодно? Ответить на этот вопрос не всегда просто, вот основные пути:
- Посмотреть, связаны ли изменения друг с другом
- Экспериментировать
- Ну а если совсем не понятно что происходит:
Идём пока что дальше.
word/_rels/document.xml.rels
Изначально diff выглядит вот так:
Видно, что часть изменений связана с тем, что Word изменил порядок связей, уберём их:
Опять появляются footer, footnotes, endnotes. Все они связаны с основным документом, перейдём к нему:
word/document.xml
Редкий случай когда есть только нужные изменения. Видна явная ссылка на footer из sectPr. А так как ссылок в документе на footnotes и endnotes нет, то можно предположить что они нам не понадобятся.
word/settings.xml
А вот и появились ссылки на footnotes, endnotes добавляющие их в документ.
word/styles.xml
Изменения в стилях нас интересуют только если мы ищем как поменять стиль. В данном случае это изменение можно убрать.
word/footer1.xml
Посмотрим теперь собственно на сам нижний колонтитул (часть пространств имён опущена для читабельности, но в документе они должны быть):
Тут виден текст 123. Единственное, что надо исправить — убрать ссылку на .
В результате анализа всех изменений делаем следующие предположения:
- footnotes и endnotes не нужны
- В [Content_Types].xml надо добавить footer
- В word/_rels/document.xml.rels надо добавить ссылку на footer
- В word/document.xml в тег надо добавить
Уменьшаем diff до этого набора изменений:
Затем запаковываем документ и открываем его.
Если всё сделано правильно, то документ откроется и в нём будет нижний колонтитул с текстом 123. А вот и итоговый коммит.
Таким образом процесс поиска изменений сводится к поиску минимального набора изменений, достаточного для достижения заданного результата.
Практика
Найдя интересующее нас изменение, логично перейти к следующему этапу, это может быть что-либо из:
- Создания docx
- Парсинг docx
- Преобразования docx
Тут нам потребуются знания XSLT и XPath.
Давайте напишем достаточно простое преобразование — замену или добавление нижнего колонтитула в существующий документ. Писать я буду на языке Caché ObjectScript, но даже если вы его не знаете — не беда. В основном будем вызовать XSLT и архиватор. Ничего более. Итак, приступим.
Алгоритм
Алгоритм выглядит следующим образом:
- Распаковываем документ.
- Добавляем наш нижний колонтитул.
- Прописываем ссылку на него в [Content_Types].xml и word/_rels/document.xml.rels .
- В word/document.xml в тег добавляем тег или заменяем в нём ссылку на наш нижний колонтитул.
- Запаковываем документ.
Распаковка
В Caché ObjectScript есть возможность выполнять команды ОС с помощью функции $zf(-1, oscommand). Вызовем unzip для распаковки документа с помощью обёртки над $zf(-1):
Создаём файл нижнего колонтитула
На вход поступает текст нижнего колонтитула, запишем его в файл in.xml:
В XSLT (файл — footer.xsl) будем создавать нижний колонтитул с текстом из тега xml (часть пространств имён опущена, вот полный список):
В результате получится файл нижнего колонтитула footer0.xml :
Добавляем ссылку на колонтитул в список связей основного документа
Сссылки с идентификатором rId0 как правило не существует. Впрочем можно использовать XPath для получения идентификатора которого точно не существует.
Добавляем ссылку на footer0.xml c идентификатором rId0 в word/_rels/document.xml.rels :
Прописываем ссылки в документе
Далее надо в каждый тег добавить тег или заменить в нём ссылку на наш нижний колонтитул. Оказалось, что у каждого тега может быть 3 тега — для первой страницы, четных страниц и всего остального:
Добавляем колонтитул в [Content_Types].xml
Добавляем в [Content_Types].xml информацию о том, что /word/footer0.xml имеет тип application/vnd.openxmlformats-officedocument.wordprocessingml.footer+xml :
В результате
Весь код опубликован. Работает он так:
- in.docx — исходный документ
- out.docx — выходящий документ
- TEST — текст, который добавляется в нижний колонтитул
Выводы
Используя только XSLT и ZIP можно успешно работать с документами docx, таблицами xlsx и презентациями pptx.
Добрый день. Я думаю, часть пользователей компьютеров уже успели столкнуться с XML-файлами. А именно, текстовыми документами, у которых формат XML. Конечно, не все люди толком понимают, что это за расширение, и как его правильно открыть? Например, многим людям пришли файлы от налоговой в формате XML, и теперь эти люди не знают: — Чем открыть xml файлы росреестра в человекочитаемом формате?
Что значит XML расширение?
Итак, давайте с начала. Ведь если не понять азы, а именно, что такое формат XML, людям трудно будет понять, каким именно образом лучше всего открыть данный формат. Этот формат содержит в себе информацию, которую отформатировали определенным методом.
У подобных документов разметка похожа на HTML, специальный язык, созданный дли страниц сайтов, с разницей в том, что в подобном документе свойства и описание определяют теги и атрибуты, которые задали вручную.
На данный момент, файлы с таким расширением встречаются частенько. XML файлы встречаются в виде единых баз информации, различных списков по настройке софта и утилит. Также, фалами XML могут быть страницы ресурсов в интернете. Файлы с подобной разметкой могут быть применены во время создания аудио, или видео каталогов.
Например, в веб программировании используют такой известный файл, как sitemap.xml. В переводе на русский, это «карта сайта» (файл, где веб мастер помещает адреса всех страниц своего ресурса). Данный файл создан для поисковика Google. Вообще, стандарт XML создали специально в виде универсального, чтобы было удобнее обмениваться информацией среди различных программ.
Как открыть файл XML – рассмотрим самые простые методы
Как мы поняли, на ПК установлено определённое число программ, которые могут открыть этот файл. Обычно, в таких случаях, Windows предлагает сделать выбор из специальных программ, способных открыть данный файл.
В интернете данные файлы обычно открывают роботы поисковых систем в автоматическом режиме, и обычный читатель сайта этого не замечает. Но чем его можно открыть простому человеку? Давайте кликнем по такому файлу мышкой и попробуем его открыть.
Для этого, я выбираю, чтобы долго не искать, тот же файл sitemap.xml моего сайта, кликаю по нему левой кнопкой мышки. Файл открывает браузер Internet Explorer. То, что вы видите на скриншоте, действительно находится на данном файле, но, в сжатом виде. Это не значит, что все карты сайта так выглядят, просто я этот файл специально сжал для более быстрой загрузки сайта. Такая форма открытия хороша для роботов поисковых систем. Роботу от поисковика, и многим программистам, в этом наборе символов всё понятно. Но, обычному человеку нет. Зато, обычный человек понимает, что файлы с расширением XML содержат текст.
Вообще, XML расшифровывается как eXtensible Markup Language, что переводится как «Расширяемый язык». Отсюда понятно, что это один из языков программирования. Простому пользователю в суть данного языка вникать не следует.
Чем ещё можно открыть подобный файл XML?
Как я уже сказал, такие файлы содержать текст. Отсюда, попробуем открыть данный файл самым простым текстовым редактором «Блокнот». Итак, опять попробуем открыть файл sitemap.xml. Кликнем по файлу правой кнопкой мышки. Выберем «Открыть с помощью» и среди программ ниспадающего меню, выберем «блокнот».
Теперь, мы уже видим структуру кода данного документа. Вам понятно, что этот код означает? Мне да. В файле идёт перечисление адресов статей моего сайта, времени их написания, и прочее.
Итак, давайте вспомним, чем ещё предлагала система открыть данные файлы? Одной из лучших программ для этого, на мой взгляд, является бесплатная русифицированная программа просмотра файлов сайта «Notepad++» (эта программа очень похожа на Блокнот). Скачать Notepad++ https://notepad-plus-plus.org/download/v7.6.html с официального сайта. Затем, во время установки, если вы увидите, что дизайн идёт английский, не забудьте поменять его на русский!
Как вы заметили, данная программа имеет, по сравнению с блокнотом, более богатый функционал, включавший разнообразное меню, вроде «Кодировки», «Инструменты», «Макросы», «Поиск» и прочее. Да и сам код файла выглядит более красиво. Различные части кода отмечены разным цветом.
Если же «Notepad++» открывает письма с крякозябрами, то, это значит, их нужно перевести в нормально читаемый формат. Для этого, откроем «Notepad++». В меня выбираем «Кодировки», затем выберем «Кодировка в UTF-8 без BOM». Теперь в данном редакторе, у вас должен открыться человеко читаемый формат!
Чем ещё предлагала система открыть файл XML?
Программу WordPad. Эта программа похожа на урезанный Word программ «Office», только системный. Итак, открываем программой WordPad. Как видно из скриншота, текстовая часть кода та же, но, возможности меню увеличены. Хотя, для данного файла они лишние.
Чем ещё предлагала система открыть файл? Обычным Word. Итак, открываем файл этим текстовым редактором. Как видим, программа Word преобразила коды в настоящие ссылки и даты, которые закодированы в этом файле. Я думаю, части пользователей такой вариант открытия файла кажется боле удобным. Как по мне, более понятно, когда видишь вариант кода таким, какой он есть, чем преображенный. То есть, лучше всего файл с расширением XML открывает программа «Notepad++».
Как открыть файл XML присланный Росреестром?
Я не могу сказать точно, зачем чиновники этой службы так мудрят, но, самый лучший способ открыть файл XML от Росреестра, это, как не смешно это звучит, можно на самом сайте Росреестра. Вся процедура довольно полно показана в следующем видео.
На официальный сайт Росреестра можно зайти по ссылке… . На сайте также можно официально обратиться в поддержку отой организации.
Кроме этих программ, открыть XML могут прочие браузеры, а не только Internet Explorer. Открывает данный файл другая программа Office «Excel». Но, для файлов этого расширения существуют специальные программы, в которых включена углублённая поддержка синтаксиса данного языка. Это программы: — XML Pad, EditiX Lite Version, XML Marker.
Вывод: — Открыть XML файл довольно просто, достаточно кликнуть по нему одним курсором мышки, и он откроется в одном из браузеров. Но, в режиме открытия файла в браузере, мы не можем его редактировать. Для редактирования я рекомендую применять «Notepad++». Если же вам необходимо провести более тщательное редактирование файла, я рекомендую применять программы из предыдущего абзаца, вроде XML Marker. Успехов!
Основная трудность, с которой сталкиваются многие пользователи исходного сетевого языка — правильное открытие его документов.
Существует целый ряд программ, поддерживающих работу с ним. Но даже они не исключают вероятность ошибок.
В этой статье мы расскажем как таковых избежать и сохранить его структуру.
Формат xml — что это такое
Расширяемый язык разметки, он же eXtensible Markup Language, один из самых часто используемых в интернете. Его назначение — описание документов и частичное описание поведения утилит, которые его читают.
Он имеет широкую область применения:
позволяет свободно расширять разметку под потребности и задачи для её использования;
является основой для создания новых видов — YML, OpenXML, FB2;
распространён в документообороте.
Чем открыть файл хмл
Основные операции для любых программируемых данных — их изменение и просмотр. Поэтому вопрос, чем открыть их в читаемом виде, как никогда актуален.
Отобразить содержимое поможет простой блокнот — AkelPad, notepad или notepad++, установленный на ПК, или один из веб-браузеров при наличии специального плагина. Но правильным будет открывать формат в контексте того сервиса или той программы, для которых он был создан (Рисунок 2).
Открыть файл xml онлайн
Остановимся на самом простом способе. Как уже было отмечено, для комфортного просмотра в браузере нужен отдельный плагин. Это XML Viewer (Рисунок 3).
Чтобы открыть файл онлайн, запустите обозреватель и нажмите комбинацию клавиш Ctrl+O (в английской раскладке). Для MacOS — введите Command+O. Затем выберите необходимый объект и нажмите Enter.
Чем открыть файл xml на компьютере (Виндовс)
Для этих целей подходят все современные текстовые редакторы.
Примечание: Если у вас установлен windows 10, документ будет автоматически открываться в окне браузера назначенного по умолчанию, в Microsoft Edge.
Эту опцию легко перенастроить в контекстном меню, используя пункт «открыть с помощью», или в постоянных настройках — «свойства»«общие»«изменить»«ок».
Чем ещё можно открыть xml на компьютере?
- Текстовый редактор Word. Новые версии легко преобразуют список данных в читаемую структуру.
- Microsoft Office Excel. Информация будет организована в виде таблицы. Минус — очень медленная загрузка (Рисунок 4).
- Блокнот Notepad. Быстро читает даже тяжёлые документы. Его функционал можно увеличить за счёт дополнений.
Как открыть xml файл в excel
Это самое распространённое приложение. Разберём на примере пошаговой инструкции, как открыть xml файл с его помощью.
Используйте стандартную команду. Если у вас версия 2007 года, то нажмите кнопку Microsoft Office, а затем — «открыть».
Укажите путь к нужному элементу во всплывающем окне, выберите его и откройте для просмотра.
Как открыть файл хмл на Linux
На Linux встречается два типа расширения — привычный нам вид и OpenXML. Они доступны для чтения и редактирования в одном из пакетов офисных программ — LibreOffice и OpenOffice.
Примечание: Просмотреть исходные элементы в данной среде можно тем же образом, что и на любой другой операционной системе.
Открытие файла xml MacOS
Один из вариантов чтения объекта был упомянут выше. Это просмотр в окне интернет-обозревателя.
Для открытия непосредственно на MacOS есть MS Excell и текстовые редакторы из пакетов OpenOffice и LibreOffice (Рисунок 5).
Чем открыть файл xml на андроид
Формат поддерживается практически всеми современными устройствами.
Первое из короткого списка приложений, чем открыть файл xml на андроид — это Axel (XML EditorViewer). Его используют для создания, редактирования и чтения данных этого типа.
На втором месте бывший Андроид Офис, он же OfficePro.
Он поддерживает:
MS Word — doc, docx, rtf, xml;
MS Excel — xls, xlsx;
MS PowerPoint — ppt, pptx;
текстовики и CSV.
Какой программой открыть файл xml
Кроме уже перечисленного ПО, для чтения и внесения изменений, используют онлайн-редакторы, платные и бесплатные программные комплексы.
Oxygen XML Editor;
EditiX Lite Version.
Список программ
MS Office, XML Notepad 2007 – OS Windows;
LibreOffice, OpenOffice – универсальны для любых дистрибутивов;
MS Excell — MacOS.
Как проверить xml файл на ошибки
Сложная структура расширяемого языка разметки подразумевает наличие определённых несоответствий при его открытии в виде электронной таблицы. Поэтому часто задаваемый вопрос, как проверить xml файл на ошибки, требует отдельного внимания.
Они возникают при невозможности выполнения проверки информации на соответствие карте данных документа. Для получения их описания, нажмите кнопку «сведения» в открывшемся диалоговом окне.
Ниже приведены объяснения частых несоответствий.
Ошибка проверки схемы. При выборе в свойствах карты опции «проверка данных на соответствие схеме при импорте и экспорте». Они были только импортированы, но не прошли саму проверку.
Импорт некоторых данных в виде текста. Чтобы снова воспользоваться ими для вычислений, их надо преобразовать в цифры и даты. Используйте соответствующие типы для каждого из значений. К примеру, для выполнения функции «год» необходим тип «дата».
Ошибка разбора формата. Средство синтаксического анализа не может прочесть выбранный объект. Проверьте документ на правильность и логичность его построения.
Невозможно найти карту соответствующую указанным данным. Проблема возникает из-за одновременного импорта сразу нескольких объектов. Вначале импортируйте схему для того который отмечен в строке заголовка вашего окна, а потом выполняйте его импорт.
Не изменяется размер таблицы. Она дополняется новой информацией только снизу. Под ней может находится элемент, который мешает менять её размер. К примеру, рисунок или ещё одна таблица, препятствующая расширению. Измените их расположение на листе.
Программа для открытия xml файлов: скачать бесплатно
Скачать бесплатно программу редактор OpenOffice (for Windows) или OpenOffice (For Mac OS) для открытия этих файлов вы можете на нашем сайте, или с официального ресурса.