Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/227.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用php删除xml中标记值之间的空格_Php_Arrays_Xml_Filter_Simplexml - Fatal编程技术网

使用php删除xml中标记值之间的空格

使用php删除xml中标记值之间的空格,php,arrays,xml,filter,simplexml,Php,Arrays,Xml,Filter,Simplexml,我一直在搜索如何删除PHP代码在导出到XML时留下的标记值之间的空格的信息,我将详细解释,首先加载XML,然后使用xPath搜索文件,然后删除一些与某些品牌不匹配的元素,最后将其重新导出为新的XML,问题是这个新XML充满了代码留下的空白。我试着修了一下,但似乎没法正常工作 这是我的密码: <?php $sXML = simplexml_load_file('file.xml'); //First load the XML $brands = $sXML->xPath('//bran

我一直在搜索如何删除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

?>
xPath('//brand')//我搜索标签
函数过滤器(字符串$input){//然后我给它一个变量列表
开关($input){
案例“品牌3”:
案例“品牌4”:
返回false;
违约:
返回true;
}
}
数组_walk($brands,函数($brand){//I删除与列表不匹配的所有元素
$content=(字符串)$brand;
if(过滤器($content)){
$item=$brand->xPath('..')[0];
未设置($item[0]);
}
});
$sXML->asXML('filted.xml');//最后导出一个新的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>

00001
产品1
品牌1
00002
产品2
品牌2
00003
产品3
品牌3
00004
产品4
品牌4
00005
产品5
品牌5
脚本的输出将发送以下内容:

<?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>

00001
产品1
品牌1
00002
产品2
品牌2
00005
产品5
品牌5

正如您在输出中看到的,产品2和产品5之间有一个空白,我需要删除它。任何帮助都将不胜感激。

您可以通过将
LIBXML\u NOBLANKS
选项传递到
SimpleXML\u load\u file
来强制SimpleXML在读取文件时修剪所有空白:

$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>

另一种可能是使用
preg\u 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);
//获取simpleXml作为字符串
$xmlAsString=$yourSimpleXmlObject->asXML();
//删除换行符
$xmlAsString=preg_replace(“/\n/”,“”,$xmlAsString);
//删除标记之间的空格

$xmlAsString=preg_replace(“/>\s*在
SimpleXML
上使用
DOM
可能会有更好的运气,因为它有正确删除节点的方法。遍历父节点也容易得多太简单了,太简单了。非常好用!
// 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);