使用 php 删除 xml 中标签值之间的空格
Remove white spaces between tag values in xml with php
我一直在搜索如何在将PHP代码导出到XML时删除标记值之间的白色spaces,我将详细说明,首先我加载和 XML 然后我用 xPath 搜索文件,然后删除一些与某些品牌不匹配的元素,最后我将它重新导出为新的 XML,问题是这个新的 XML满是代码留下的白色space。我尝试了 trim,但它似乎无法正常工作。
这是我的代码:
<?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 之间有一个白色 space,我需要将其删除。任何帮助将不胜感激。
你可以在读取文件时强制 SimpleXML 到 trim all 空白,方法是将 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 而不是简单 XML - 但无需更改任何现有代码即可轻松实现,因为dom_import_simplexml
只是 "rewraps" XML 而不重新解析它。
然后你可以使用the DOMDocument
formatOutput
property and save()
method来"pretty-print"文件:
$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 声明)。
我一直在搜索如何在将PHP代码导出到XML时删除标记值之间的白色spaces,我将详细说明,首先我加载和 XML 然后我用 xPath 搜索文件,然后删除一些与某些品牌不匹配的元素,最后我将它重新导出为新的 XML,问题是这个新的 XML满是代码留下的白色space。我尝试了 trim,但它似乎无法正常工作。
这是我的代码:
<?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 之间有一个白色 space,我需要将其删除。任何帮助将不胜感激。
你可以在读取文件时强制 SimpleXML 到 trim all 空白,方法是将 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 而不是简单 XML - 但无需更改任何现有代码即可轻松实现,因为dom_import_simplexml
只是 "rewraps" XML 而不重新解析它。
然后你可以使用the DOMDocument
formatOutput
property and save()
method来"pretty-print"文件:
$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 声明)。