Как передать массив в XML
Что проверяют
Понимаете ли вы, что в XML нет типа «массив» и его приходится выражать структурой документа. Следом обычно просят показать, как безопасно собрать такой XML в браузере и как потом отличить массив из одного элемента от обычного поля.
Как отвечать
Массив в XML это повторяющиеся элементы с одним именем, как правило внутри обёртки: <tags><tag>js</tag><tag>css</tag></tags>. Порядок элементов в документе значим, поэтому последовательность сохраняется. Дальше опишите, как это делается на фронтенде:
- нативный DOM:
document.implementation.createDocument(null, "tags", null), затемcreateElementиtextContentдля каждого значения, в концеnew XMLSerializer().serializeToString(doc).textContentсам экранирует&и<, ручная склейка строк не нужна; - библиотеки:
fast-xml-parserумеет и собирать XML (XMLBuilder), и разбирать его,xmlbuilder2удобен для сложных документов с пространствами имён; - отправка:
fetch(url, { method: "POST", body: xml, headers: { "Content-Type": "application/xml" } }). Если это SOAP, структуру массива задаёт схема сервиса, и имена элементов берутся из WSDL, а не придумываются; - обратный разбор:
new DOMParser().parseFromString(text, "application/xml"), затемquerySelectorAll. При ошибке парсер не бросает исключение, а возвращает документ с элементомparsererror, его нужно проверять явно.
Атрибуты под массив не годятся: у элемента не может быть двух одноимённых атрибутов.
Где спотыкаются
Склеивают XML шаблонной строкой без экранирования. Первое же значение с & или < ломает документ, а пользовательский ввод превращается в инъекцию разметки.
Теряют массив из одного элемента при переводе XML в JSON. <tags><tag>js</tag></tags> превращается в строку, а не в список, и код падает на .map. В fast-xml-parser для этого есть опция isArray: в ней перечисляют пути, которые всегда считаются массивами.
Используют индекс как имя элемента, вроде <0>. Имя XML-элемента не может начинаться с цифры, такой документ невалиден.