CardDavXmlUtilsTest.ktCardDavXmlUtils: извлечение корневого элемента, парсинг идентификаторов контактов из multiget-запросов, извлечение имени/значения XML-элемента с поддержкой пространств имён и экранирование XML-сущностей. Эти утилиты образуют основу парсинга XML для обработчика протокола CardDAV.CardDavXmlUtils предоставляет лёгкий парсинг XML без полноценного DOM/SAX-парсера — используя извлечение на основе регулярных выражений для специфических XML-нагрузок CardDAV. Такой подход выбран, поскольку XML-нагрузки CardDAV структурно предсказуемы (определены RFC 4918, 6352) и критичны к производительности.
Извлекает имя корневого XML-элемента из строки, обрабатывая опциональное XML-объявление (<?xml ... ?>) и элементы с префиксом пространства имён (d:multistatus). Тесты покрывают:
<d:multistatus xmlns:d="DAV:"> → multistatus<?xml version="1.0"?>, возвращает multistatusЭто критически важно для обработчика ответов PROPFIND/REPORT, чтобы направлять запрос к правильному построителю ответов на основе типа корневого элемента.
Парсит тело запроса CardDAV addressbook-multiget REPORT для извлечения ID контактов ProjectForge из элементов <d:href>. Тесты парсят реалистичную XML-нагрузку с тремя записями <d:href>{путь}/ProjectForge-{id}.vcf</d:href> и проверяют корректное извлечение ID 7833476, 7858940, 7859171.
Метод использует сопоставление с регулярным выражением для шаблона имени файла ProjectForge-{id}.vcf внутри элементов href. Результат — Sequence<Int> (ленивое вычисление через .toList()).
Находит именованный элемент в XML и возвращает его квалифицированное имя, включая префикс пространства имён:
propd:propИзвлекает текстовое содержимое именованного элемента из XML, обрабатывая:
<etag> </etag> → " " (сохраняет пробелы)<etag /> → null (нет текстового содержимого)<d:etag /> → null<d:sync-token>123456</d:sync-token> → 123456Экранирует пять специальных XML-символов в соответствии со спецификацией XML 1.0:
< → <> → > (обрабатывается; тестовый ввод содержит >)" → "& → &' → '<hurzel test="dkfsld"> & ' экранируется в <hurzel test="dkfsld"> & '.
Все тесты используют функцию области видимости Kotlin let с сырыми строковыми литералами ("""...""") для XML-тестовых данных. trimIndent() и trimMargin() используются для очистки многострочных тестовых фикстур с сохранением структуры XML.
868d6abb7 2025 -> 2026 63081666f Заголовки исходных файлов: 2024-> 2025. 5167dab99 WIP: Carddav 6c1daac93 WIP: Carddav 0d7a81f91 WIP: Carddav dc3936193 WIP: Carddav (Thunderbird работает, только чтение, включая изображения и т.д.) caee35750 WIP: Carddav 2ad0cfe66 WIP: Carddav