Какой у вас опыт работы с XML в PHP?

Ответ

В PHP я работал с XML для парсинга конфигураций, обработки данных из внешних API и генерации отчетов. Основные использованные инструменты:

  • SimpleXML — для быстрого чтения и простой навигации по XML-структурам.
  • DOMDocument — когда требовалось создавать сложные документы, модифицировать узлы или валидировать структуру.
  • XPath — для выполнения сложных запросов к XML-документам.

Пример парсинга RSS-ленты с SimpleXML и XPath:

$rss = simplexml_load_file('https://example.com/feed.rss');
// Регистрируем пространство имен, если оно есть
$rss->registerXPathNamespace('dc', 'http://purl.org/dc/elements/1.1/');

// Ищем все заголовки статей, опубликованные за последнюю неделю
$items = $rss->xpath('//item[dc:date > "' . date('c', strtotime('-1 week')) . '"]/title');

foreach ($items as $title) {
    echo (string) $title . "n";
}

Пример создания XML-документа с DOMDocument для экспорта данных:

$dom = new DOMDocument('1.0', 'UTF-8');
$dom->formatOutput = true;

$root = $dom->createElement('users');
$dom->appendChild($root);

$users = [['id' => 1, 'name' => 'Alice'], ['id' => 2, 'name' => 'Bob']];

foreach ($users as $userData) {
    $userElement = $dom->createElement('user');
    $userElement->setAttribute('id', $userData['id']);

    $nameElement = $dom->createElement('name', $userData['name']);
    $userElement->appendChild($nameElement);

    $root->appendChild($userElement);
}

// Валидация по XSD схеме (если она есть)
if ($dom->schemaValidate('schema/users.xsd')) {
    echo $dom->saveXML();
    // или $dom->save('export.xml');
}

Также имел дело с валидацией XML через XSD-схемы и преобразованием XML в другие форматы с помощью XSLT.

Ответ 18+ 🔞

Да ты посмотри, какой у нас тут специалист по XML подъехал! Ну что ж, расскажу, как я с этой штукой работал, а то вдруг кому пригодится, хотя, честно говоря, иногда проще JSON спарсить, чем с этими пространствами имён ебаться.

В общем, в PHP я с XML дела имел — и конфиги читал, и данные от каких-то левых API обрабатывал, которые в каменном веке застряли, и отчёты генерировал. Инструменты, в основном, вот эти:

  • SimpleXML — это когда надо быстро, без лишних телодвижений, файлик прочитать и по нему пройтись. Удобно, если структура простая и тебе её не надо перекраивать.
  • DOMDocument — вот это уже серьёзная артиллерия. Берёшь, когда нужно документ с нуля собрать, узлы там поменять или по строгой схеме проверить. Мощная штука, но и возни с ней, ядрёна вошь, побольше.
  • XPath — а это вообще магия. Когда в XML-документе нужно найти что-то конкретное, а он размером с "Войну и мир", XPath тебя спасает. Пишешь запрос, как в базе данных, и получаешь что нужно.

Вот, смотри, как я однажды RSS-ленту парсил, SimpleXML и XPath в деле:

$rss = simplexml_load_file('https://example.com/feed.rss');
// А тут самое весёлое — если в RSS есть эти ебушки-воробушки, пространства имён, их надо зарегить
$rss->registerXPathNamespace('dc', 'http://purl.org/dc/elements/1.1/');

// Ищем все заголовки статей, которые за неделю вышли
$items = $rss->xpath('//item[dc:date > "' . date('c', strtotime('-1 week')) . '"]/title');

foreach ($items as $title) {
    echo (string) $title . "n";
}

Бывало, конечно, что какой-нибудь feed кривой попадётся, и всё падало — тут уже терпения ноль ебать, идёшь и ругаешься с тем, кто API делает.

А вот пример, когда нужно было данные в XML для какого-то старого сервиса выгрузить. Тут уже DOMDocument в бой пошёл:

$dom = new DOMDocument('1.0', 'UTF-8');
$dom->formatOutput = true; // Чтобы красиво было, а не одна строка

$root = $dom->createElement('users');
$dom->appendChild($root);

$users = [['id' => 1, 'name' => 'Alice'], ['id' => 2, 'name' => 'Bob']];

foreach ($users as $userData) {
    $userElement = $dom->createElement('user');
    $userElement->setAttribute('id', $userData['id']);

    $nameElement = $dom->createElement('name', $userData['name']);
    $userElement->appendChild($nameElement);

    $root->appendChild($userElement);
}

// И самое важное — если есть схема XSD, валидируем, а то примут и скажут "чё за хуйню прислал"
if ($dom->schemaValidate('schema/users.xsd')) {
    echo $dom->saveXML();
    // или $dom->save('export.xml');
} else {
    // А тут уже волнение ебать, потому что схему не прошёл и всё надо переделывать
}

Ещё, бывало, через XSLT преобразовывал XML во что-то другое, или наоборот. В общем, инструмент хоть и старый, но в некоторых конторах живёт, как будто на дворе 2002-й год, так что знать его полезно. Главное — не запутаться во всех этих тегах и пространствах, а то можно реально с ума сойти.