【问题标题】:Clear newlines and all unnecessary whitespaces in xml tags清除 xml 标签中的换行符和所有不必要的空格
【发布时间】:2016-01-05 17:44:27
【问题描述】:

我需要将所有 XML 标记放在一行中(ie 清除换行符);如果可能的话,我想清除所有其他不必要的空格,但这并不重要。

我需要这种清理的原因是:
我正在使用DOMDocument::schemaValidate() 针对 XSD 架构验证 XML。该函数返回带有行号的错误,这些行号与我在其中显示结果的编辑器中编号的行号不匹配(因为验证器会忽略标签中的换行符,而编辑器不会)。

我发现了很多关于使用正则表达式在两个特定分隔符之间匹配字符串的问题和答案,但不适用于在两个分隔符之间匹配 一些 特定字符。我找到的最接近的是: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" >

只有封闭的&lt;&gt;之间的空格会受到影响。标签内容应该保持原样。
提前感谢您的帮助。

【问题讨论】:

    标签: php regex xml


    【解决方案1】:

    您不需要正则表达式,只需使用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>
    

    【讨论】:

    • 你是对的......这就是我在编辑器中显示的内容,我错误地分析了行号差异:在我的编辑器中删除了换行符,它在错误返回中schemaValidate() 实际上确实将它们考虑在内。那么我应该怎么做,$dom-&gt;loadXml($source),然后是$tmp=$dom-&gt;saveXml(),然后是$dom-&gt;loadXml($tmp),这样$dom-&gt;schemaValidate() 才能在“干净”源上工作?听起来很奇怪......但我发现loadXml() 没有选项可以忽略这些换行符。
    • 我刚刚添加了这个变量以坚持 3 项必要的操作
    猜你喜欢
    • 2014-12-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-07-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多