Разрывная линия прерывает пробелы перед XML-XML - что является правильным методом?

Мне интересно, как разрешить разрывы строк из строк PHP, предназначенных для XML. Используя следующий метод, я остаюсь с разными 2-4 пробелами между моими XML-тегами.

$current = $xml->saveXML();
$current = str_replace(array("\r\n", "\r", "\n"), "", $current);

Каков правильный синтаксис для удаления разрывов строк, поэтому XML-теги появляются сквозным, без добавления пробелов между ними?

Ответ 1

Сначала некоторые основные вещи: $xml->saveXML() предлагает использовать SimpleXML. Он использует только один символ разделителя строки в своем выходе: "\n".

Поэтому поиск "\r\n" и "\r" неверен. Также использование str_replace() не является хорошей идеей, вместо этого следует использовать strtr():

$current = strtr($current, array("\n" => ''));

Поскольку это только заменяет разрывы строк, пробельные символы между элементами XML не удаляются или не меняются здесь.

Однако эти пробельные символы сильно зависят от вашего входного XML. И в XML вы можете иметь значительную (удаление было бы ошибкой) и несущественные пробелы (сохранить для удаления), но Simplexml или DOMDocument не знают (и не могут) знать, какой из них.

Как сами библиотеки не знают, вам нужно их рассказать. Например, похоже, что вы ищете обрезку всех текстовых узлов. Поскольку SimpleXMLElement не позволяет получить доступ к текстовым узлам, вам необходимо использовать DOMXPath. Но не бойтесь, это не так сложно:

$doc   = dom_import_simplexml($xml)->ownerDocument;
$xpath = new DOMXPath($doc);
foreach ($xpath->query('//text()') as $text) {
    $text->data = trim($text->data);
}

Это просто итерация по всем текстовым узлам в порядке их расположения и обрезка.

Тогда вам нужно только получить XML, начиная с элемента документа. Это лишит декларацию XML и любые предыдущие комментарии и инструкции по обработке (я предполагаю, что вы этого хотите):

$current = $doc->saveXML($doc->documentElement);

В случае нет, применяются правила разделителя строк сверху. Тогда вы можете:

$current = $xml->saveXML();
$current = strtr($current, array("\n" => ''));

И что это. Надеюсь, это будет полезно.