



  

Документация Краткое руководство по XML 01.12.2015 v2

 [Краткое руководство по XML](index.html#document-index) 

 latest

 

* [Предисловие ко 2-му изданию](index.html#document-preface)

	+ [Авторские права](index.html#id2)

	+ [Обратная связь](index.html#id3)

* [I. Коротко об XML](index.html#document-xml-intro)

	+ [Введение в XML](index.html#id1)

	+ [Структура XML](index.html#id2)

	+ [Правила синтаксиса (Валидность)](index.html#id3)

	+ [Сущности](index.html#essence)

	+ [Поиск информации в XML файлах (XPath)](index.html#xml-xpath)

	+ [Кодировки](index.html#id5)

	+ [XSD схема](index.html#xsd)

* [II. Инструменты для работы с XML](index.html#document-tools)

	+ [Tester](index.html#tester)

	+ [XMLPad](index.html#xmlpad)

	+ [UVFilesCorrector](index.html#uvfilescorrector)

	+ [Xpath-Tester](index.html#xpath-tester)

	+ [Notepad++](index.html#notepad)

	+ [Geany](index.html#geany)

	+ [WinMerge](index.html#winmerge)

* [III. Практические примеры](index.html#document-xml-experience)

	+ [Исправление невалидных XML-файлов](index.html#xml)

	+ [Удаление лишних блоков(абзацев) из XML по заданному условию](index.html#id1)

	+ [Работа с файлами отчетов Росстата](index.html#id4)

* [IV. Скрипт для замены служебных символов в XML](index.html#document-xml-healer)

	+ [Описание](index.html#index-0)

	+ [Порядок работы](index.html#id4)

	+ [Проверка изменений в файлах](index.html#id8)

	+ [Программное обеспечение](index.html#id9)

	+ [Приложение](index.html#id12)

* [V. Проверка XML-файла по XSD-схеме](index.html#document-xsd)

	+ [Проверка по XSD-схеме в XMLPad](index.html#xsd-xmlpad)

	+ [Проверка по XSD-схеме в MS Visual Studio](index.html#xsd-ms-visual-studio)

* [Список используемых источников](index.html#document-bibliography)

* [Программное обеспечение](index.html#document-programs)

[Краткое руководство по XML](index.html#document-index)

* [Docs](index.html#document-index) »

* Документация Краткое руководство по XML 01.12.2015 v2

* [Edit on GitHub](https://github.com/mazhartsev/xml-guide/blob/master/docs/source/index.rst)

---

Краткое руководство по XML[¶](#xml "Ссылка на этот заголовок")

==============================================================

Примечание

*Последняя правка:* сент. 27, 2017

**Содержание:**

Предисловие ко 2-му изданию[¶](#preface "Ссылка на этот заголовок")

-------------------------------------------------------------------

Руководство состоит из пяти разделов. В первом разделе приводятся основы языка разметки XML. Во втором разделе приведены инструменты, упрощающие работу с XML файлами. В третьем разделе рассматриваются практические примеры работы с XML. В четвертом разделе приведена инструкция по скрипту `xml\_healer.py`, исправляющего невалидные XML-файлы. В пятом разделе рассмтаривается проверка XML-файлов по XSD-схеме с помощью специальных интсрументов.

### Авторские права[¶](#id2 "Ссылка на этот заголовок")

Руководство распространяется на условиях лицензии

[«Attribution-ShareAlike» («Атрибуция — На тех же условиях» 4.0

Всемирная](https://creativecommons.org/licenses/by-sa/4.0/deed.ru).

### Обратная связь[¶](#id3 "Ссылка на этот заголовок")

Все вопросы, правки и пожелания направляйте на адрес [uksvlg@yandex.ru](mailto:uksvlg%40yandex.ru).

| Автор: | Дмитрий Мажарцев |

| Адрес: | Волгоград |

| Дата: | 06 июля 2015 года |

I. Коротко об XML[¶](#i-xml "Ссылка на этот заголовок")

-------------------------------------------------------

### Введение в XML[¶](#id1 "Ссылка на этот заголовок")

XML ( *англ.* eXtensible Markup Language) — расширяемый язык разметки,

предназначенный для хранения и передачи данных.

Простейший XML-документ выглядит следующим образом:

```

<?xml version="1.0" encoding="windows-1251"?>

<book category="WEB">

   <title lang="en">Learning XML</title>

   <author>Erik T. Ray</author>

   <year>2003</year>

   <price></price>

</book>

```

Первая строка — это XML декларация. Здесь определяется версия XML (1.0) и кодировка файла. На следующей строке описывается корневой элемент документа `<book>` (*открывающий тег*). Следующие 4 строки описывают дочерние элементы корневого элемента ( `title`, `author`, `year`, `price`). Последняя строка определяет конец корневого элемента `</book>` (*закрывающий тег*).

Документ XML состоит из *элементов* (elements). Элемент начинается *открывающим тегом* (start-tag) в угловых скобках, затем идет *содержимое* (content) элемента, после него записывается *закрывающий тег* (end-teg) в угловых скобках.

Информация, заключенная между тегами, называется содержимым или значением элемента: `<author>Erik T. Ray</author>`. Т.е. элемент `author` принимает значение `Erik T. Ray`. Элементы могут вообще не принимать значения.

Элементы могут содержать *атрибуты*, так, например, открывающий тег `<title lang="en">` имеет атрибут `lang`, который принимает значение `en`. Значения атрибутов заключаются в кавычки (двойные или ординарные).

Некоторые элементы, не содержащие значений, допустимо записывать без закрывающего тега. В таком случае символ `/` ставится в конце открывающего тега:

```

<name first="Иван" second="Петрович" />

```

### Структура XML[¶](#id2 "Ссылка на этот заголовок")

XML документ должен содержать корневой элемент. Этот элемент является «родительским» для всех других элементов.

Все элементы в XML документе формируют иерархическое дерево. Это дерево начинается с корневого элемента и разветвляется на более низкие уровни элементов.

Все элементы могут иметь подэлементы (дочерние элементы):

```

<корневой>

   <потомок>

     <подпотомок>.....</подпотомок>

   </потомок>

</корневой>

```

### Правила синтаксиса (Валидность)[¶](#id3 "Ссылка на этот заголовок")

Структура XML документа должна соответствовать определенным правилам.

XML документ отвечающий этим правилам называется *валидным* (*англ.*

Valid — правильный) или *синтаксически верным*. Соответственно, если

документ не отвечает правилам, он является *невалидным* .

Основные правила синтаксиса XML:

1. Теги XML регистрозависимы — теги XML являются регистрозависимыми. Так, тег `<Letter>` не то же самое, что тег `<letter>`.

Открывающий и закрывающий теги должны определяться в одном регистре:

> 

> 

> ```

> <Message>Это неправильно</message>

> <message>Это правильно</message>

> 

> ```

> 

> 

> 

2. XML элементы должны соблюдать корректную вложенность:

> 

> 

> ```

> <b><i>Некорректная вложенность</b></i>

> <b><i>Корректная вложенность</i></b>

> 

> ```

> 

> 

> 

3. У XML документа должен быть корневой элемент — XML документ должен содержать один элемент, который будет родительским для всех других элементов. Он называется корневым элементом.

> 

> 

> Примечание

> 

> 

> В большинстве XML файлов отчетов для ФНС корневым элементом является `<Файл></Файл>`. После закрывающего тега `</Файл>` больше ничего быть не должно.

> 

> 

> 

> 

4. Значения XML атрибутов должны заключаться в кавычки:

> 

> 

> ```

> <note date="12/11/2007">Корректная запись</note>

> <note date=12/11/2007>Некорреткная запись</note>

> 

> ```

> 

> 

> 

### Сущности[¶](#essence "Ссылка на этот заголовок")

Некоторые символы в XML имеют особые значения и являются служебными. Если вы поместите,

например, символ `<` внутри XML элемента, то будет

сгенерирована ошибка, так как парсер интерпретирует его, как начало

нового элемента.

В примере ниже будет сгенерирована ошибка, так как в значении `"ООО<Мосавтогруз>"` атрибута `НаимОрг` содержатся символы `<` и `>`.

```

<НПЮЛ ИННЮЛ="7718962261" КПП="771801001" НаимОрг="ООО<Мосавтогруз>"/>

```

Также ошибка будет сгенерирована и в слудющем примере, если название организации взять в обычные кавычки (английские двойные):

```

<НПЮЛ ИННЮЛ="7718962261" КПП="771801001" НаимОрг="ООО"Мосавтогруз""/>

```

Чтобы ошибки не возникали, нужно заменить символ `<` на его

сущность. В XML существует 5 предопределенных сущностей:

Таблица I.1 — Сущности[¶](#id7 "Постоянная ссылка на таблицу")

| Сущность | Символ | Значение |

| --- | --- | --- |

| `&lt;` | `<` | меньше, чем |

| `&gt;` | `>` | больше, чем |

| `&amp;` | `&` | амперсанд |

| `&apos;` | `'` | апостроф |

| `&quot;` | `"` | кавычки |

Примечание

Только символы `<` и `&` строго запрещены в XML. Символ `>` допустим, но лучше его всегда заменять на сущность.

Таким образом, корректными будут следующие формы записей:

```

<НПЮЛ ИННЮЛ="7718962261" КПП="771801001" НаимОрг="ООО&quot;Мосавтогруз&quot;"/>

```

или

```

<НПЮЛ ИННЮЛ="7718962261" КПП="771801001" НаимОрг="ООО«Мосавтогруз»"/>

```

В последнем примере английские двойные кавычки заменены на французские кавычки («ёлочки»), которые не являются служебными символами.

### Поиск информации в XML файлах (XPath)[¶](#xml-xpath "Ссылка на этот заголовок")

XPath ( *англ.* XML Path Language) — язык запросов к элементам

XML-документа. XPath расширяет возможности работы с XML.

XML имеет древовидную структуру. В документе всегда имеется корневой

элемент (инструкция `<?xml version=”1.0”?>` к дереву отношения не имеет).

У элемента дерева всегда существуют потомки и предки, кроме корневого

элемента, у которого предков нет, а также тупиковых элементов (листьев

дерева), у которых нет потомков. Каждый элемент дерева находится на

определенном уровне вложенности (далее — «уровень»). У элементов на

одном уровне бывают предыдущие и следующие элементы.

Это очень похоже на организацию каталогов в файловой системе, и строки

XPath, фактически, — пути к «файлам» — элементам. Рассмотрим пример

списка книг:

```

<?xml version="1.0" encoding="windows-1251"?>

<bookstore>

   <book category="COOKING">

     <title lang="it">Everyday Italian</title>

     <author>Giada De Laurentiis</author>

     <year>2005</year>

     <price>30.00</price>

   </book>

   <book category="CHILDREN">

     <title lang="en">Harry Potter</title>

     <author>J K. Rowling</author>

     <year>2005</year>

     <price>29.99</price>

   </book>

   <book category="WEB">

     <title lang="en">Learning XML</title>

     <author>Erik T. Ray</author>

     <year>2003</year>

     <price>39.95</price>

   </book>

</bookstore>

```

XPath запрос `/bookstore/book/price` вернет следующий результат:

```

<price>30.00</price>

<price>29.99</price>

<price>39.95</price>

```

Сокращенная форма этого запроса выглядит так: `//price`.

С помощью XPath запросов можно искать информацию по атрибутам. Например,

можно найти информацию о книге на итальянском языке: `//title[@lang="it"]` вернет `<title lang="it">Everyday Italian</title>`.

Чтобы получить больше информации, необходимо модифицировать запрос `//book[title[@lang="it"]]` вернет:

```

<book category="COOKING">

     <title lang="it">Everyday Italian</title>

     <author>Giada De Laurentiis</author>

     <year>2005</year>

     <price>30.00</price>

   </book>

```

В приведенной ниже таблице представлены некоторые выражения XPath и

результат их работы:

Таблица I.2 — Выражения XPath[¶](#id8 "Постоянная ссылка на таблицу")

| Выражение XPath | Результат |

| --- | --- |

| `/bookstore/book[1]` | Выбирает первый элемент `book`, который является потомком элемента `bookstore` |

| `/bookstore/book[position()<3]` | Выбирает первые два элемента `book`, которые являются потомками элемента `bookstore` |

| `//title[@lang]` | Выбирает все элементы `title` с атрибутом `lang` |

| `//title[@lang=’en’]` | Выбирает все элементы `title` с атрибутом `lang`, который имеет значение `en` |

| `/bookstore/book[price>35.00]` | Выбирает все элементы `book`, которые являются потомками элемента bookstore и которые содержать элемент `price` со значением больше `35.00` |

| `/bookstore/book[price>35.00]/title` | Выбирает все элементы `title` элементов book элементов `bookstore`, которые содержать элемент `price` со значением больше `35.00` |

### Кодировки[¶](#id5 "Ссылка на этот заголовок")

И еще один важный момент, который стоит рассмотреть — кодировки. Существует множество кодировок, о них подробнее можно прочитать в статье [Набор

символов](https://ru.wikipedia.org/wiki/%D0%9D%D0%B0%D0%B1%D0%BE%D1%80_%D1%81%D0%B8%D0%BC%D0%B2%D0%BE%D0%BB%D0%BE%D0%B2).

Самыми распространенными кириллическими кодировками являются `Windows-1251` и `UTF-8`. Последняя является одним из стандартов, но большая часть ФНС отчетности имеет кодировку `Windows-1251`.

В XML файле кодировка объявляется в декларации:

```

<?xml version="1.0" encoding="windows-1251"?>

```

Часто можно столкнуться с ситуацией, когда текстовый редаткор некорректно распознает кодировку и отображает кракозябры. В такой случае, необходимо выбрать кодировку вручную, для этого выполните:

Таблица I.3 — Смена кодировки в разных программах[¶](#id9 "Постоянная ссылка на таблицу")

| Программа | Кодировка |

| --- | --- |

| Notepad++ | *«Документ → Кодировка»* |

| Geany | *«Документ → Установить кодировку»* |

| Firefox | *«Вид → Кодировка»* |

| Chrome | *«Настройка → Дополнительные инструменты → Кодировка»* |

Примечание

В большинстве случаев при работе с русскоязычными файлами помогает переключение кодировки на `Windows-1251` или `UTF-8`. Если все равно не удается прочитать содержимое XML документа, стоит открыть его в Mozilla Firefox, он отлично распознает кодировки.

Если ничего не помогает, вполне возможно, что файл был поврежден.

### XSD схема[¶](#xsd "Ссылка на этот заголовок")

**XML Schema** — язык описания структуры XML-документа, его также называют **XSD**. Как большинство языков описания XML, XML Schema была задумана для определения правил, которым должен подчиняться документ. Но, в отличие от других языков, XML Schema была разработана так, чтобы её можно было использовать в создании программного обеспечения для обработки документов XML.

После проверки документа на соответствие XML Schema читающая программа может создать модель данных документа, которая включает:

* словарь (названия элементов и атрибутов);

* модель содержания (отношения между элементами и атрибутами и их структура);

* типы данных.

Каждый элемент в этой модели ассоциируется с определённым типом данных, позволяя строить в памяти объект, соответствующий структуре XML-документа. Языкам объектно-ориентированного программирования гораздо легче иметь дело с таким объектом, чем с текстовым файлом.

Подробнее об XSD смотрите:

* [XML Schema](https://ru.wikipedia.org/wiki/XML_Schema)

* [XSD — умный XML](http://habrahabr.ru/post/90696/)

Примечание

Примером использования XSD cхем может служить электронная отчетность:

* [ФНС: Справочник налоговой и бухгалтерской отчетности](http://format.nalog.ru/)

II. Инструменты для работы с XML[¶](#ii-xml "Ссылка на этот заголовок")

-----------------------------------------------------------------------

XML-документы представляют собой обыкновенные текстовые файлы. Для

работы с ними достаточно любого простейшего текстового редактора. Однако

существуют специальные инструменты для работы с XML.

Все приведенные ниже программы являются бесплатными, их можно скачать с

официальных сайтов.

### Tester[¶](#tester "Ссылка на этот заголовок")

[Tester](http://www.nalog.ru/rn77/program/all/tester/) — Программа,

разработанная ФНС для проверки файлов на соответствие форматам

представления в электронном виде налоговых деклараций, бухгалтерской

отчетности.

### XMLPad[¶](#xmlpad "Ссылка на этот заголовок")

[XMLPad](http://xmlpad-mobile.com/) — многофункциональный

специализированный XML редактор.

XMLPad обладает богатым функционалом, поддерживает XPath, возможность

удалять целые блоки тегов, смену кодировок, проверку валидности и т.д.

### UVFilesCorrector[¶](#uvfilescorrector "Ссылка на этот заголовок")

[UVFilesCorrector](http://www.uvsoftium.ru/uvFilesCorrector.php) —

программа для быстрого исправления текстовых файлов, текста в буфере

обмена и просто выделенного текста. Позволяет искать и заменять целые

блоки текста.

### Xpath-Tester[¶](#xpath-tester "Ссылка на этот заголовок")

[Xpath-Tester](http://codebeautify.org/Xpath-Tester) — сайт для

тестирования запросов XPath.

### Notepad++[¶](#notepad "Ссылка на этот заголовок")

[Notepad++](http://notepad-plus-plus.org/download/) — мощный

текстовый редактор с функцией нумерации строк и выбора кодировки.

### Geany[¶](#geany "Ссылка на этот заголовок")

[Geany](http://www.geany.org/) — cвободная среда разработки

программного обеспечения, написанная с использованием библиотеки GTK2.

Поддерживает смену кодировок, нумерацию строк и т.д.

### WinMerge[¶](#winmerge "Ссылка на этот заголовок")

[WinMerge](http://winmerge.org/?lang=ru) — Open Source инструмент сравнения и слияния для Windows. WinMerge может сравнивать как файлы, так и папки, отображая различия в визуальной текстовой форме, которые легко понять и обработать.

III. Практические примеры[¶](#iii "Ссылка на этот заголовок")

-------------------------------------------------------------

В данной главе приведены некоторые практические приемы работы с XML-файлами.

### Исправление невалидных XML-файлов[¶](#xml "Ссылка на этот заголовок")

Если по каким-то причинам между тегами оказывается символ `<` или лбой другой управляющий символ (подробнее смотрите [Таблица I.1 — Сущности](index.html#xml-valid)), то при синтаксическом анализе XML-файла возникнет ошибка «Невалидный XML».

Исправляется данная проблема просто — данные символы необходимо заменить на их сущности (подробнее смотрите раздел [Сущности](index.html#essence)). Сделать это можно, воспользовавшись любым нормальным текстовым редактором с функцией поиска и замены с использованием *регулярных выражений*.

Совет

Подробнее о регулярных выражениях смотрите статью [Регулярные

выражения](https://ru.wikipedia.org/wiki/%D0%A0%D0%B5%D0%B3%D1%83%D0%BB%D1%8F%D1%80%D0%BD%D1%8B%D0%B5_%D0%B2%D1%8B%D1%80%D0%B0%D0%B6%D0%B5%D0%BD%D0%B8%D1%8F)

и книгу [Бен Форта: Освой самостоятельно регулярные выражения. 10

минут на урок](http://rutracker.org/forum/viewtopic.php?t=3828631)

Примечание

Сообщение о невалидности XML-файла может возникать если после закрывающего родительского тега (см. раздел parrent-tag) находится еще какой-либо текст. В данном случае достаточно удалить все, что идет после закрывающего родительского тега.

Также можно воспользоваться скриптом `xml\_healer.py`, который автоматически заменяет управляющие символы на их сущности и удаляет лишние символы после закрывающего родительского тега. Подробная инструкция по работе со скриптом приведена в главе [IV. Скрипт для замены служебных символов в XML](index.html#xml-healer).

### Удаление лишних блоков(абзацев) из XML по заданному условию[¶](#id1 "Ссылка на этот заголовок")

Теги в структуре XML образуют многострочные блоки. Иногда возникает необходимость удалить ряд целых блоков по заданному условию. В качестве примера будет рассмотрена ситуация с отчетом по НДС.

Для передачи налоговой отчетности по ТКС в контролирующие органы используется XML. Весь учет ведется в одних программах (например, в 1С), затем выгружается из них в xml формате и отправляется по ТКС непосредственно в контролирующие органы.

Из-за несовершенства некоторых программ, периодически возникают проблемы при передаче файлов в контролирующие органы.

#### Суть проблемы[¶](#id2 "Ссылка на этот заголовок")

Согласно [приказу ФНС от 29 октября 2014 г. N ММВ-7-3/558@](https://normativ.kontur.ru/document?from=extern&moduleId=1&documentId=244104) в Книге продаж элемент `<СвПокуп>` (Сведения о покупателе, его ИНН/КПП) является необязательным, другими словами он может полностью отсутствовать.

Отрывок книги продаж выглядит следующим образом:

```

<КнПродСтр НомерПор="134" НомСчФПрод="11444" ДатаСчФПрод="27.11.2014" СтоимПродСФ="397917.28" СтоимПродСФ0="397917.28">

    <КодВидОпер>01</КодВидОпер>

    <СвПокуп>

        <СведЮЛ ИННЮЛ="0190670940" КПП="000000000"/>

    </СвПокуп>

</КнПродСтр>

<КнПродСтр НомерПор="135" НомСчФПрод="2332838" ДатаСчФПрод="23.10.2014" СтоимПродСФ="6790000.00" СумНДССФ18="603389.90">

    <КодВидОпер>02</КодВидОпер>

    <СвПокуп>

        <СведЮЛ ИННЮЛ="7743596506" КПП="774301001"/>

    </СвПокуп>

</КнПродСтр>

```

А нижеприведенный блок в Книге продаж необязателен:

```

<СвПокуп>

        <СведЮЛ ИННЮЛ="7743596506" КПП="774301001"/>

</СвПокуп>

```

Если есть сделки с иностранными контрагентами, у которых нет ИНН/КПП, следовательно, сведения о покупателе не заполняются. Но из-за логической ошибки в программе бухгалтерского учета, выгрузка сформированного отчета была невозможна, так как программа ошибочно требовала указать ИНН/КПП для всех контрагентов.

Чтобы обойти эту ошибку пришлось вместо ИНН указать регистрационный номер контрагента в стране регистрации, а вместо КПП указать девять нулей.

Но при попытке отравить выгруженный отчет в контролирующий орган, возникала обратная ошибка. Так как ИНН и КПП были фиктивными, то при проверке отчета не выполнялись контрольные соотношения.

[![Проверка файла отчета программой Tester](_images/xml-man-tester-001.png)](_images/xml-man-tester-001.png)

Проверка файла отчета программой Tester

Примечание

ИНН и КПП это не произвольный набор чисел, они содержат определенные контрольные соотношения.

Теперь следовало вручную исправить XML файл отчета и удалить лишние блоки с фиктивными данными.

#### Решение проблемы[¶](#id3 "Ссылка на этот заголовок")

Так как файл содержал свыше 15000 строк и большое количество сделок, надо было автоматизировать данный процесс.

С помощью запроса Xpath и сервиса [Xpath-Tester](http://codebeautify.org/Xpath-Tester) были найдены все сделки с иностранными контрагентами. Запрос имел

вид `//СвПокуп[СведЮЛ[@КПП0"000000000"]]`. Получилось приличное количество сделок, свыше 200.

[![Запрос Xpath](_images/xml-man-xpath-002.jpg)](_images/xml-man-xpath-002.jpg)

Надо было удалить порядка 700 строк, полностью содержащих блоки (причем

с разными псевдо-ИНН):

```

<СвПокуп>

    <СведЮЛ ИННЮЛ="0291265150" КПП="000000000"/>

</СвПокуп>

```

Большинство программ умеет искать и заменять максимум одну строку на

другую. В данном случае надо было искать и заменять блок текста из трех

строк.

С этим успешно справилась программа [UVFilesCorrector](http://www.uvsoftium.ru/uvFilesCorrector.php). Интерфейс программы прост до невозможности. В нижней части на вкладке *Файлы* выбираем нужный нам файл.

[![](_images/xml-man-uv-003a.jpg)](_images/xml-man-uv-003a.jpg)

В верхнем поле *Список замен* необходимо нажать на пустое поле и создаем правило для замены. В данном случае оно выглядело так:

[![](_images/xml-man-uv-005.jpg)](_images/xml-man-uv-005.jpg)

На скриншоте видно не все выражение, в поле *Что найти:* в режиме

*Шаблон (регулярное выражение)* введено:

```

<СвПокуп>\r\n

    <СведЮЛ ИННЮЛ=".........." КПП="000000000"/>\r\n

 </СвПокуп>

```

Совет

Подробнее о регулярных выражениях смотрите статью [Регулярные

выражения](https://ru.wikipedia.org/wiki/%D0%A0%D0%B5%D0%B3%D1%83%D0%BB%D1%8F%D1%80%D0%BD%D1%8B%D0%B5_%D0%B2%D1%8B%D1%80%D0%B0%D0%B6%D0%B5%D0%BD%D0%B8%D1%8F)

и книгу [Бен Форта: Освой самостоятельно регулярные выражения. 10

минут на урок](http://rutracker.org/forum/viewtopic.php?t=3828631)

Десять точек в `ИННЮЛ=".........."` являются *регулярным выражением* и означают, что на их месте может стоять любой символ. В итоге получилось, что под замену попадали все блоки, имеющие нулевые КПП. Комбинация символов `\r\n` также является регулярным выражением и означает перенос строки.

Всего у организации было 14 контрагентов, с которыми в общей сумме было

заключено 266 сделок. Следовательно, после нажатия на кнопку *Заменить*

получилось 266 замены.

[![](_images/xml-man-uv-007.jpg)](_images/xml-man-uv-007.jpg)

[![](_images/xml-man-uv-006.jpg)](_images/xml-man-uv-006.jpg)

Буквально за один простой шаг по заданному условию было удалено свыше

700 строк. Проверка Tester’ом ошибок не выявила и файл был успешно отправлен в контролирующий орган.

---

### Работа с файлами отчетов Росстата[¶](#id4 "Ссылка на этот заголовок")

Файлы отчетов Росстата формируются в одну строку, что создает определенные сложности при просмотре в обычных тектовых редакторах.

[![](_images/togs-001.png)](_images/togs-001.png)

В отличии, например, от файлов отчетов ФНС.

[![](_images/fns-001.png)](_images/fns-001.png)

С файлами Росстата лучше работать с помощью программы [XMLPad](http://xmlpad-mobile.com/).

**XMLPad имеет несколько режимов отображения:**

1. Стандартный режим (Source) отображения и редактирования кода.

> 

> 

> [![](_images/togs-002.png)](_images/togs-002.png)

> 

> В левой панели отображается структура XML-файла. Значения элементов можно отреактировать напрямую, либо через левую нижнюю панель.

> 

> 

> 

2. Режим отображения сеткой (Grid).

> 

> 

> [![](_images/togs-003.png)](_images/togs-003.png)

> 

> 

3. Табличный вид (Table View).

> 

> 

> [![](_images/togs-004.png)](_images/togs-004.png)

> 

> 

3. Режим предпросмотра (Preview).

> 

> 

> [![](_images/togs-005.png)](_images/togs-005.png)

> 

> 

Совет

Также XMLPad позволяет проверить XML-файл по XSD-схеме, подробнее в разделе [V. Проверка XML-файла по XSD-схеме](index.html#xsd).

IV. Скрипт для замены служебных символов в XML[¶](#iv-xml "Ссылка на этот заголовок")

-------------------------------------------------------------------------------------

### Описание[¶](#index-0 "Ссылка на этот заголовок")

`xml\_healer.py` (*англ.* healer — целитель) — скрипт для массового исправления невалидных XML файлов.

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

* Символ `&` заменяется на `&amp;`;

* Символ `<` заменяется на `'&lt;`;

* Символ `>` заменяется на `&gt;`

* Символы `«»` заменяются на `&quot;`

Также скрипт удаляет все, что идет после закрывающего родительского тега `<\Файл>`.

#### Системные требования[¶](#id2 "Ссылка на этот заголовок")

Для работы скрипта необходимо установить интерпретатор языка программирования Python (<https://www.python.org/downloads/>) версии 3 или выше.

#### Авторские права[¶](#id3 "Ссылка на этот заголовок")

Скрипт xml\_healer.py распространяется на условиях лицензии [«Attribution-ShareAlike» («Атрибуция — На тех же условиях») 4.0 Всемирная](https://creativecommons.org/licenses/by-sa/4.0/deed.ru).

---

### Порядок работы[¶](#id4 "Ссылка на этот заголовок")

1. Поместить скрипт `xml\_healer.py` в папку с XML файлами отчетов;

2. Запустить скрипт двойным нажатием и дождаться завершения его работы;

3. Ещё раз прогнать исправленный XML файл через [Tester](http://www.nalog.ru/rn77/program/all/tester/).

После завершения обработки файлов в командной строке будет выведена информация о результате обработки и сообщение «*Нажмите Enter*». Обработанные файлы будут находиться в папке `out`. Оригинальные файлы останутся нетронутыми в текущей директории.

#### Выводимая информация[¶](#id5 "Ссылка на этот заголовок")

В ходе выполнения скрипта выводится несколько типов сообщений:

```

Имя файла: NO_NDS.9_0000_0000_00000000000000000000_20150427_80c4e37b-a160-4b2f-827c-69226f792dfd.xml

Исцелен!

```

Сообщение `Исцелен!` означает, что файл успешно обработан и его исправленная копия находится в папке `out`.

```

Имя файла: ФАЙЛ.odt

Не является XML-файлом

```

Сообщение `Не является XML-файлом` означает, что файл не является файлом отчета. `xml\_healer.py` сканирует все файлы в папке, в которой находится и обрабатывает только те файлы, в конце которых стоит расширение `.xml`.

```

Имя файла: file.xml

Файл имеет кодировку отличную от windows-1251

```

Сообщение появляется, если XML файл имеет кодировку отличную от `windows-1251`. Возможно, данный XML файл не является файлом отчета, так как файлы отчетов должны иметь кодировку `windows-1251`.

#### Рекомендации[¶](#id6 "Ссылка на этот заголовок")

После работы скрипта рекомендуется прогнать XML файлы через [Tester](http://www.nalog.ru/rn77/program/all/tester/). При проверке невалидного XML файла Tester, натыкаясь на первый же некорректный символ, прекращает проверку. `xml\_healer.py` исправляет все некорректные символы и Tester может осуществить полную проверку файла, в ходе которой могут обнаружиться ошибки уже не в структуре файла, а в самом содержимом.

---

### Проверка изменений в файлах[¶](#id8 "Ссылка на этот заголовок")

Чтобы проверить и сравнить изменения в XML файлах, необходимо воспользоваться программой [WinMerge](http://winmerge.org/about/?lang=ru).

[![WinMerge — программа для сравнения текстовых файлов](_images/xml_healer_screen-007.jpg)](_images/xml_healer_screen-007.jpg)

Слева — исходный файл. Справа — файл после обработки скриптом `xml\_healer.py`

---

### Программное обеспечение[¶](#id9 "Ссылка на этот заголовок")

* [xml\_healer.py](https://github.com/mazhartsev/xml_healer.py/archive/master.zip)

* [Python 3](https://www.python.org/downloads/)

* [Tester](http://www.nalog.ru/rn77/program/all/tester/)

* [WinMerge](http://winmerge.org/about/?lang=ru)

### Приложение[¶](#id12 "Ссылка на этот заголовок")

Процесс работы скрипта `xml\_healer.py` со скриншотами:

[![Шаг 0 — Прогон файла через Tester](_images/xml_healer_screen-004.jpg)](_images/xml_healer_screen-004.jpg)

Шаг 0 — Прогон файла через Tester

[![Шаг 1 — Поместить скрипт с файлами для обработки](_images/xml_healer_screen-001.png)](_images/xml_healer_screen-001.png)

Шаг 1 — Поместить скрипт с файлами для обработки и дойным нажатием запустить скрипт.

[![Шаг 2 — Во время работы скрипта откроется окно командной строки, в котором будет выведен результат обработки файлов.](_images/xml_healer_screen-002.png)](_images/xml_healer_screen-002.png)

Шаг 2 — Во время работы скрипта откроется окно командной строки, в котором будет выведен результат обработки файлов.

[![Шаг 3 — Обработанные файлы будут находиться в папке out](_images/xml_healer_screen-003.png)](_images/xml_healer_screen-003.png)

Шаг 3 — Обработанные файлы будут находиться в папке `out`.

[![Шаг 4 — Повторный прогон исправленного файла через Tester](_images/xml_healer_screen-005.jpg)](_images/xml_healer_screen-005.jpg)

Шаг 4 — Повторный прогон исправленного файла через Tester

V. Проверка XML-файла по XSD-схеме[¶](#v-xml-xsd "Ссылка на этот заголовок")

----------------------------------------------------------------------------

В данном разделе описаны способы проверки XML-файла по XSD-схеме. Сделать это можно разными способами, существует много программ для этих целей. По XSD-схеме, например, проверяет программа [Tester](http://www.nalog.ru/rn77/program/all/tester/), но она только показывает ошибки и не дает их исправить. Для большего удобства лучше использовать специализированные редакторы такие, как XMLPad или MS Visual Studio.

Совет

Проверять файл по XSD-схеме целесообрано в исключительных случаях, например, если скрипт `xml-healer.py` не справился с исправлением файла. Подробнее в главе [IV. Скрипт для замены служебных символов в XML](index.html#xml-healer).

**MS Visual Studio** является спецаилизированным инструментом для программистов, обладающим огромным функционалом. Работа с XML и автоматическая проверка по XSD – лишь одна из множества функций среды разработки. MS Visual Studio 15 можно скачать бесплатно с официального сайта: <https://www.visualstudio.com/ru-ru/products/visual-studio-community-vs>.

**XMLPad** — многофункциональный специализированный XML редактор. XMLPad обладает богатым функционалом, поддерживает XPath, возможность удалять целые блоки тегов, смену кодировок, проверку валидности и т.д. XMLPad доступен для бесплатного использования на сайте: <http://xmlpad-mobile.com>.

Совет

XMLPad уступает по удобству и возможностям MS Visual Studio, но если вы не являетесь программистом и у вас не установлена MS Visual Studio, лучше воспользоваться XMLPad.

Примечание

Перед проверкой файлов необходимо предварительно скачать файлы XSD-схем. Скачать XSD-схемы можно с официальных сайтов контролирующих органов. В качестве примера взята декларация по НДС, скачать XSD-схему для нее можно с сайта [Справочник налоговой и бухгалтерской отчетности](http://format.nalog.ru/).

### Проверка по XSD-схеме в XMLPad[¶](#xsd-xmlpad "Ссылка на этот заголовок")

1. Откройте XML-файл, который требуется проверить в XMLPad *File > Open*.

[![](_images/xml-validate-001.png)](_images/xml-validate-001.png)

2. Чтобы проверить файл по заданной XSD-схеме, его надо с ней ассоциировать. Перейдите в меню *XML > Assign Schema/DTD*.

[![](_images/xml-validate-002a.png)](_images/xml-validate-002a.png)

3. Выберите *W3C Schema* и нажмите *Browse*, затем выберите XSD-схему для проверки.

[![](_images/xml-validate-003.png)](_images/xml-validate-003.png)

[![](_images/xml-validate-004.png)](_images/xml-validate-004.png)

4. После того, как XSD-схема ассоциирована, нажмите `F7` или *XML > Validate*, чтобы проверить файл. В нижней части окна будут выведены ошибки, нажав на которые можно подсветить строку, в которой они находятся.

[![](_images/xml-validate-005.png)](_images/xml-validate-005.png)

Совет

Для удобства отображения можно включить переносы строк *Edit > Word Wrap*.

### Проверка по XSD-схеме в MS Visual Studio[¶](#xsd-ms-visual-studio "Ссылка на этот заголовок")

1. Откройте XML-файл, который требуется проверить в MS Visual Studio *Файл > Открыть > Файл*.

[![](_images/ms-vstudio-001.png)](_images/ms-vstudio-001.png)

2. Чтобы проверить файл по заданной XSD-схеме, его надо с ней ассоциировать. Перейдите в меню *XML-код > Схемы...*.

[![](_images/ms-vstudio-002.png)](_images/ms-vstudio-002.png)

3. Нажмите *Добавить* и выберите файл XSD-схемы.

[![](_images/ms-vstudio-003.png)](_images/ms-vstudio-003.png)

Проверка на соответсвие XSD-схеме будет осуществляться автоматически на лету. Внизу в окне *Списка ошибок* будет отображаться список ошибок. При нажатии на ошибку, она будет подсвечена в редакторе.

Совет

Добавить окно *Списка ошибок* можно через *Вид > Списка ошибок*.

Список используемых источников[¶](#bibliography "Ссылка на этот заголовок")

---------------------------------------------------------------------------

1. [Бен Форта: Освой самостоятельно регулярные выражения. 10 минут на

урок](http://rutracker.org/forum/viewtopic.php?t=3828631)

2. [Учебник XML для

начинающих](http://msiter.ru/tutorials/uchebnik-xml-dlya-nachinayushchih)

3. [Википедия:XML](https://ru.wikipedia.org/wiki/XML)

4. [Википедия: XPath](https://ru.wikipedia.org/wiki/XPath)

5. [Спецификация XML Path

(XPath)](http://citforum.ru/internet/xpath/index.shtml)

6. [Кодировка UTF-8](https://ru.wikipedia.org/wiki/UTF-8)

7. [Кодировка

Windows-125](https://ru.wikipedia.org/wiki/Windows-1251)

8. [Набор

символов](https://ru.wikipedia.org/wiki/%D0%9D%D0%B0%D0%B1%D0%BE%D1%80_%D1%81%D0%B8%D0%BC%D0%B2%D0%BE%D0%BB%D0%BE%D0%B2)

9. [Приказ ФНС от 29 октября 2014 г. N

ММВ-7-3/558@](https://normativ.kontur.ru/document?from=extern&moduleId=1&documentId=244104)

Об утверждении формы налоговой декларации по налогу на добавленную

стоимость, порядка ее заполнения, а также формата представления

налоговой декларации по налогу на добавленную стоимость в электронной

форме

10. [Приказ ФНС от 29 июня 2012 г. N

ММВ-7-6/435@](https://normativ.kontur.ru/document?moduleId=1&documentId=202931&cwi=355)

Об утверждении порядка и условий присвоения, применения, а также

изменения идентификационного номера налогоплательщика

Программное обеспечение[¶](#id1 "Ссылка на этот заголовок")

-----------------------------------------------------------

1. [xml\_healer.py](https://github.com/mazhartsev/xml_healer.py/archive/master.zip)

2. [Python 3](https://www.python.org/downloads/)

3. [Xpath-Tester](http://codebeautify.org/Xpath-Tester)

4. [Geany](http://www.geany.org/)

5. [Notepad++](http://notepad-plus-plus.org/download/)

6. [XMLPad](http://xmlpad-mobile.com/)

7. [Tester](http://www.nalog.ru/rn77/program/all/tester/)

8. [UVFilesCorrector](http://www.uvsoftium.ru/uvFilesCorrector.php)

9. [WinMerge](http://winmerge.org/?lang=ru)

10. [MS Visual Studio](https://www.visualstudio.com/ru-ru/products/visual-studio-community-vs)

* [Алфавитный указатель](genindex.html)

