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

Я искал информацию о том, как удалить пробелы между значениями тегов, оставляемыми кодом 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 есть пробел, и мне нужно его удалить. Любая помощь будет признательна.

Ответы [ 2 ]

2 голосов
/ 20 марта 2019

Вы можете заставить 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, не анализируя его.

Тогда вы можете использовать DOMDocument formatOutput свойство и 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');
0 голосов
/ 22 июля 2019

Другая возможность - использовать 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).

...