在xml标记中清除换行符和所有不必要的空格

时间:2015-10-08 08:07:39

标签: php regex xml

我需要所有XML标记适合一行(清除换行符);如果可能的话,我想清除所有其他不必要的空格,但这不太重要 原因是:我正在使用DOMDocument::schemaValidate()来针对XSD架构验证XML。该函数返回行号错误,这些行号与我在显示结果的编辑器中编号的行号不匹配(因为验证器忽略了标签中的换行符,编辑器没有)。

我发现很多关于使用regexp在两个特定分隔符之间匹配字符串的问题和答案,但不是在两个分隔符之间匹配某些特定字符。我找到的最近的是:Remove whitespace from XML tags但是我无法在php中使用它。

示例:给定字符串:

<package xmlns="http://www.idpf.org/2007/opf" 
    version=""
    unique-identifier=""
    prefix="optional"
    lang="optional"
    dir="optional"
    id="optional"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://www.idpf.org/2007/opf http://fpierrat.fr/mvs/epub3-opf.xsd"
>

我需要删除标记名和属性之间的所有换行符(如果可能的话,还有所有额外标签和额外空格)。输出应如下所示:

<package xmlns="http://www.idpf.org/2007/opf" version="" unique-identifier="" prefix="optional" lang="optional" dir="optional" id="optional" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.idpf.org/2007/opf http://fpierrat.fr/mvs/epub3-opf.xsd" >

只有封闭的<>之间的空格才会受到影响。标记内容应保持原样。
在此先感谢您的帮助。

1 个答案:

答案 0 :(得分:3)

您不需要正则表达式,只需使用DOMDocument::saveXML

实施例

$xml = <<<'XML'
<package xmlns="http://www.idpf.org/2007/opf"
    version=""
    unique-identifier=""
    prefix="optional"
    lang="optional"
    dir="optional"
    id="optional"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://www.idpf.org/2007/opf http://fpierrat.fr/mvs/epub3-opf.xsd"
>
<foo>
    look at my
    fancy
    whitespace
</foo>         <bar/>
</package>
XML;

$dom = new DOMDocument();
$dom->loadXML($xml);
echo $dom->saveXML();

输出:

<?xml version="1.0"?>
<package xmlns="http://www.idpf.org/2007/opf" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" version="" unique-identifier="" prefix="optional" lang="optional" dir="optional" id="optional" xsi:schemaLocation="http://www.idpf.org/2007/opf http://fpierrat.fr/mvs/epub3-opf.xsd">
<foo>
    look at my
    fancy
    whitespace
</foo>         <bar/>
</package>