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






Вы можете заставить 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');
Так просто, так легко. Работает идеально!
Другая возможность - использовать 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).
Возможно, вам больше повезет с использованием
DOMвместоSimpleXML, поскольку у него есть методы для правильного удаления узлов. Также намного проще перейти к родительскому узлу.