我需要所有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" >
只有封闭的<
和>
之间的空格才会受到影响。标记内容应保持原样。
在此先感谢您的帮助。
答案 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>