Что такое XML документ и из чего он состоит
Что проверяют
Умеете ли вы читать и проверять XML, с которым QA встречается постоянно: SOAP-сервисы, конфиги, выгрузки для банков и госсистем. Следом часто спрашивают, чем well-formed документ отличается от валидного и как проверить XML по схеме.
Как отвечать
XML (eXtensible Markup Language) это текстовый формат для структурированных данных с тегами, которые придумывает сам автор. Из чего состоит документ:
- пролог: необязательное объявление
<?xml version="1.0" encoding="UTF-8"?>. Если оно есть, то стоит в самом начале, даже пробел перед ним ломает разбор. Там же может быть объявление DTD; - корневой элемент: ровно один на документ, внутри него всё остальное;
- элементы: открывающий и закрывающий теги с содержимым,
<price>39.95</price>, либо пустой элемент<br/>. Имена чувствительны к регистру, теги не перекрываются; - атрибуты: пары имя и значение в открывающем теге, значение всегда в кавычках, дважды один атрибут в элементе не повторяется;
- текст и сущности: символы
<и&в тексте пишутся как<и&, предопределённых сущностей всего пять; - CDATA и комментарии:
<![CDATA[...]]>для текста без разбора,<!-- -->для комментариев; - пространства имён:
xmlns:soap="..."разводят одинаковые имена тегов из разных словарей, без них не прочитать ни один SOAP-конверт.
Дальше различайте два уровня. Well-formed документ соблюдает синтаксис, его разберёт любой парсер. Валидный ещё и соответствует схеме: XSD или DTD описывают, какие элементы обязательны, в каком порядке идут и какого типа. Значения в ответе ищут через XPath, например //book[@genre="fiction"]/title, в SoapUI для этого есть проверка XPath Match.
Где спотыкаются
Говорят, что у каждого тега обязана быть закрывающая пара, и забывают про пустые элементы вида <tag/>.
Путают XML с HTML: в XML нет заранее известных тегов, регистр важен, а незакрытый тег не прощается, парсер останавливается с ошибкой.
Не знают про XXE. Парсер, который разрешает внешние сущности, можно заставить прочитать файл с сервера, и такая проверка входит в тест безопасности любого сервиса, принимающего XML.