ReformatXML

From SunFlurry wiki
Revision as of 09:04, 28 June 2021 by Admin (talk | contribs) (1 revision imported)
(diff) ← Older revision | Latest revision (diff) | Newer revision → (diff)
Jump to: navigation, search
  ReformatXML (Функции работы со строками)
Статус разработки: Частичная реализация
Тип:Функция
Обращение к БД:Нет
Исключения:Невозможно превратить в строку, число
Визуальность:Нет

Функция приводит текст в XML нотации к каноническому простому виду с тем, чтобы его можно было разобрать обычными текстовыми функциями. Позволяет настроить глубину упрощения текста. Функция оптимизирована для работы с большими файлами. Функция принимает как строковой аргумент, так и объекты вида TEXT. Строковой аргумент будет превращен в строку UTF-16 перед обработкой.
Функция принимает как аргументы, с разделителями _NEWLINE (Chr(13)+Chr(10)), с разделителями Chr(10), так и аргументы, использующие смешанные разделители _NEWLINE и chr(10). Результат всегда будет иметь разделители _NEWLINE (Chr(13)+Chr(10)).
Без учета дополнительных режимов, функция производит в исходной строке следующие изменения:

  • Сохраняет все данные, идущие до первого тега <...> в оригинальном виде без изменения (однако, знаки переноса строк (см. выше) приводятся к одному виду по всему тексту). Если в тексте до начала xml встречается знак <, он будет расценен, как начало xml, поэтому, начальный текст не должен содержать знаков <, иначе он будет искажен.
  • Сохраняет все данные, идущие после последнего закрывающегося значащего xml тега, с учетом условий предыдущего пункта.
  • Размещает каждый новый тег на новой строке. Если тег включает подтеги, конструкция закрытия оного будет следовать отдельной строкой, если тег не включает подтегов, то закрытие тега будет следовать той же самой строкой.
  • Знаки перевода строк удаляются из значений тегов (режим может быть отключен, см. ниже).
  • Особые теги <?... ?>, <!... >, <!--... -->, не имеющие закрывающих конструкций, всегда будут следовать отдельными строками и иметь перенос сразу после завершения.
  • Все незначащие пробелы, табуляции и переносы строк (в т.ч. между тегами) будут удалены (режим может быть отключен для значений внутри тегов, см. ниже).
  • Значения атрибутов, ограниченные апострофами <img src='example.jpg'> будут приведены к стандартному написанию с использованием знаков кавычек <img src="example.jpg"> (возможные существующие кавычки внутри строки атрибута будут HTML-кодированы). Однако, написание атрибутов внутри особых тегов (см. выше) не будет изменено.

Синтаксис

ReformatXML(<Строка или текст (STRING,TEXT)>,<Режимы (INT)>=3):<Результат (STRING)>

Аргументы

  • <Строка или текст (STRING,TEXT)> - Аргумент, строковое представление которого необходимо переформатировать. Данный аргумент может также содержать объект, имеющий вид TEXT.
  • <Режимы (INT)> - (необязательный аргумент) Аргумент, числовое представление которого представляет режим перекодировки. Режим является битовой маской, следующие биты могут быть использованы:
    • Бит 0 (маска 1, по умолчанию): Функция также удалит все HTML комментарии из текста (т.е. будут удалены все межтеговые встречающиеся комбинации <!-- ... -->. Без использования данного режима, наличие комментариев в случайном месте может сделать невозможным корректный разбор текста простым способом.
    • Бит 1 (маска 2, по умолчанию): Функция также удалит все XML именные пространства (т.е. комбинации, типа <NameSpace:Tag xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" Version="1.0">123</Tag> будут превращены в <Tag Version="1.0">123</Tag>. Стандарт xml подразумевает использование именных пространств с любыми именами в любом количестве в любом из тегов, что может сделать невозможным корректный разбор текста простым способом. После удаления всех именных пространств, полученный xml будет по-прежнему соответствовать исходному.
    • Бит 2 (маска 4): (планируется к реализации) Функция будет сортировать расположение тегов по именам, сохраняя при этом структуру подтегов (которые в свою очередь будут подвергаться сортировке). Сортировка ведется быстрым способом по кодам символов (т.е. A<a). К примеру, строка <Sales Type="1">1111.11</Sales><Country><Name /></Country> будет отсортирована в <Country><Name /></Country><Sales Type="1">1111.11</Sales>. Иногда при получении xml одного формата из разных источников, теги могут быть перепутаны местами или следовать в разной последовательности, такая ситуация может усложнить разбор текста простым способом.
    • Бит 3 (маска 8): Все имена тегов (включая особые самозакрывающиеся теги <?... ?> и <!... >) будут приведены к верхнему регистру. Пример: <Sales Type="1">1111.11</Sales><Country><Name /></Country> превратится в <SALES Type="1">1111.11</SALES><COUNTRY><NAME /></COUNTRY>. Иногда при получении xml одного формата из разных источников, теги могут иметь имена в разном регистре, даже с учетом того, что формат xml различает регистр наименований тегов, и подобные файлы уже не будут считаться одинаковыми. Такая ситуация может усложнить разбор текста простым способом, данный режим помогает избежать этой проблемы (но не рекомендуется к использованию, если известно, что файл создан с требуемым регистром тегов).
    • Бит 4 (маска 16): Будет считаться, что файл не содержит постороннего текста, кроме xml. Весь текст, идущий до первого тега и после последнего тега будет подвергаться такой же обработке, как и текст во внутритеговом пространстве (т.е, будут удалены переводы строки и пр.). Данная опция может использоваться в файлах, которые до начала xml содержат какой-то текст. Такие файлы, однако, не рекомендуется разбирать этой функцией.
    • Бит 5 (маска 32): Все самозакрывающиеся теги будут превращены в пару -- открывающийся и закрывающийся. К примеру <Sales Invoice="123" /> будет превращено в <Sales Invoice="123"></Sales>
    • Бит 6 (маска 64): Все пробелы перед и после текста внутри тегов будут сохранены (пример: <Tag> Текст  </Tag> не превратится в <Tag>Текст</Tag>). Также все переносы строк внутри текста тегов будут сохранены и кодированы (кодирование необходимо, чтобы не нарушилось правило "одна строка -- один тег"), (пример: <Tag>Текст<_NEWLINE>Текст 2</Tag> превратится в <Tag>Текст&#13;&#10;Текст 2</Tag>).

Возвращаемое значение

Результат будет возвращен в UTF-16. Если исходный аргумент был текстом, а не строкой, результат возвращен не будет, объект первого аргумента будет обновлен значением результата. Если текст был в формате ANSI, при обновлении будет произведена перекодировка в ANSI.

Примеры

Стр:="Проверка текста, идущего до первого тега
|Проверка-2
|<?xml version=""1.0"" encoding=""utf-8""?> <!-- комментарий -->
|  <СлучайноеИмя:Project xmlns=""http://schemas.microsoft.com/developer/msbuild/2003"" xmlns:СлучайноеИмя=""http://site.org/WSITE/WSCHEMA""      >
|    <СлучайноеИмя:PropertyGroup>   <ProjectGuid>{77777777-0000-4444-9999-EEEEEEEEEEEE}<!-- 
|       комментарий 2 --></ProjectGuid>    </СлучайноеИмя:PropertyGroup>
|    <СлучайноеИмя:ItemGroup>
|
|      <Projects 
|                 Include=""Путь\Имя.dproj"">
|        <Dependencies/>
|      </Projects>
|    </СлучайноеИмя:ItemGroup>
|    <Sales                      "+chr(9)+"Invoice=""123"" />
|</СлучайноеИмя:Project>Проверка текста за последним тегом";

Message(ReformatXML(Стр,1+2+8+16+32));

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

Проверка текста, идущего до первого тега Проверка-2
<?XML version="1.0" encoding="utf-8"?>
<PROJECT>
<PROPERTYGROUP>
<PROJECTGUID>{77777777-0000-4444-9999-EEEEEEEEEEEE}</PROJECTGUID>
</PROPERTYGROUP>
<ITEMGROUP>
<PROJECTS Include="Путь\Имя.dproj">
<DEPENDENCIES></DEPENDENCIES>
</PROJECTS>
</ITEMGROUP>
<SALES Invoice="123"></SALES>
</PROJECT>
Проверка текста за последним тегом