Удалите пробелы между значениями тегов в xml с помощью php

Я искал информацию о том, как удалить пробелы между значениями тегов, оставленными кодом PHP, когда я экспортирую его в XML, я подробно объясню, сначала я загружаю и XML, затем я выполняю поиск в файле с помощью xPath, затем я удаляю некоторые элементы которые не соответствуют некоторым брендам, и, наконец, я реэкспортирую его как новый XML, проблема в том, что этот новый XML полон пробелов, оставленных кодом. Я попытался обрезать его, но, похоже, он работает неправильно.

Вот мой код:

<?php
$sXML = simplexml_load_file('file.xml'); //First load the XML
$brands = $sXML->xPath('//brand'); //I do a search for the <brand> tag

function filter(string $input) { //Then I give it a list of variables
    switch ($input) {
        case 'BRAND 3':
        case 'BRAND 4':
            return false;
        default:
            return true;
    }
}

array_walk($brands, function($brand) { //I remove all elements do not match my list
    $content = (string) $brand;
    if (filter($content)) {
        $item = $brand->xPath('..')[0];
        unset($item[0]);
    }
});

$sXML->asXML('filtred.xml'); // And finally export a new xml

?>

Это исходный XML:

<?xml version = "1.0" encoding = "utf-8"?>
<products>
  <item>
    <reference>00001</reference>
    <other_string>PRODUCT 1</other_string>
    <brand>BRAND 1</brand>
  </item>
  <item>
    <reference>00002</reference>
    <other_string>PRODUCT 2</other_string>
    <brand>BRAND 2</brand>
  </item>
  <item>
    <reference>00003</reference>
    <other_string>PRODUCT 3</other_string>
    <brand>BRAND 3</brand>
  </item>
  <item>
    <reference>00004</reference>
    <other_string>PRODUCT 4</other_string>
    <brand>BRAND 4</brand>
  </item>
  <item>
    <reference>00005</reference>
    <other_string>PRODUCT 5</other_string>
    <brand>BRAND 5</brand>
  </item>
</products>

И вывод скрипта отправляет это:

<?xml version = "1.0" encoding = "utf-8"?>
<products>
  <item>
    <reference>00001</reference>
    <other_string>PRODUCT 1</other_string>
    <brand>BRAND 1</brand>
  </item>
  <item>
    <reference>00002</reference>
    <other_string>PRODUCT 2</other_string>
    <brand>BRAND 2</brand>
  </item>


  <item>
    <reference>00005</reference>
    <other_string>PRODUCT 5</other_string>
    <brand>BRAND 5</brand>
  </item>
</products>

Как вы можете видеть на выходе, между продуктом 2 и продуктом 5 есть пробел, и мне нужно его удалить. Любая помощь будет оценена.

Возможно, вам больше повезет с использованием DOM вместо SimpleXML, поскольку у него есть методы для правильного удаления узлов. Также намного проще перейти к родительскому узлу.

Phil 20.03.2019 04:56
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
5
1
3 207
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Вы можете заставить SimpleXML обрезать пробелы все при чтении файла, передав параметр LIBXML_NOBLANKS в simplexml_load_file:

$sXML = simplexml_load_file('file.xml', null, LIBXML_NOBLANKS);

Затем, когда вы вызовете ->asXML(), все пробелы будут удалены, и вы получите XML в одной строке, например:

<?xml version = "1.0" encoding = "utf-8"?>
<products><item><reference>00003</reference><other_string>PRODUCT 3</other_string><brand>BRAND 3</brand></item><item><reference>00004</reference><other_string>PRODUCT 4</other_string><brand>BRAND 4</brand></item></products>

Чтобы повторно сгенерировать пробелы на основе оставшейся структуры, вам нужно будет использовать DOM, а не SimpleXML, но это легко сделать, не изменяя какой-либо существующий код, потому что dom_import_simplexml просто «переворачивает» XML без его повторного разбора.

Затем вы можете использовать собственность DOMDocumentformatOutput и save() метод для "красивой печати" документа:

$sXML = simplexml_load_file('file.xml', null, LIBXML_NOBLANKS);
// ...
// process $sXML as before
// ...
$domDocument = dom_import_simplexml($sXML)->ownerDocument;
$domDocument->formatOutput = true;
echo $domDocument->save('filtered.xml');

Так просто, так легко. Работает идеально!

Fernando Olvera 20.03.2019 18:25

Другая возможность - использовать preg_replace:

// Get simpleXml as string
$xmlAsString = $yourSimpleXmlObject->asXML();

// Remove newlines
$xmlAsString = preg_replace("/\n/", "", $xmlAsString);

// Remove spaces between tags
$xmlAsString = preg_replace("/>\s*</", "><", $xmlAsString);

var_dump($xmlAsString);

Теперь вы получаете XML в виде строки в одной строке (включая объявление XML).

Другие вопросы по теме