我想使用PHP Tidy来确保我的xml有效,然后再将其加载到DomDocument中。

但是,我不希望Tidy对格式进行更改-我只希望它能修复标签不平衡等问题。

可以在此页面上看到问题的示例:http://www.tek-tips.com/viewthread.cfm?qid=1654452

我自己的示例如下。

输入:<ex><context>собр<stress>а</stress>ние</context> акцион<stress>е</stress>ров — <stress>aa</stress>ndeelhoudersvergadering</ex>(已经是有效的xml)

预期输出:<ex><context>собр<stress>а</stress>ние</context> акцион<stress>е</stress>ров — <stress>aa</stress>ndeelhoudersvergadering</ex>(</context>актион之间有空白)

实际输出:

<ex>
<context>собр
<stress>а</stress>ние</context>акцион
<stress>е</stress>ров —
<stress>aa</stress>ndeelhoudersvergadering</ex>

(它删除了</context>актион之间的空格,这将使文本不可读,并在每个标签之后插入了换行符)

我的代码是:
function TidyXml($inputXml)
    {
        $config = array(
            'indent'         => false,
            'output-xml'     => true,
            'input-xml'     => true,
        );

        $tidy = new tidy();
        $tidy->parseString($inputXml, $config, 'utf8');
        $tidy->cleanRepair();
        $cleanXml = tidy_get_output($tidy);
        return $cleanXml;
    }

我尝试更改几个选项,但没有成功。

最佳答案

我找到了一个解决方案,但它有点脚,因此我仍然愿意寻求更好的建议。

<pre>放在要验证的xml周围(这指示Tidy不要更改空格),然后使用output-html设置为true修复xml,然后删除<pre>\n换行符。

例子:

$config = array(
    'indent' => false,
    'indent-attributes' => false,
    'output-html' => true,
    'input-xml' => true,
    'wrap' => 0,
    'vertical-space' => false,
    'new-inline-tags' => 'context,abr,stress',
    'new-blocklevel-tags'   => 'def,ex,examples'
);

$tidy = new tidy();
$inputXml = "<pre>" . $inputXml . "</pre>";
$validXml = $tidy->repairString($inputXml, $config, 'utf8');
$cleanXml = str_replace("\n", "", $validXml);
$cleanXml = substr($cleanXml, strlen("<pre>"), strlen($cleanXml));
$cleanXml = substr($cleanXml, 0, strlen($cleanXml)-strlen("</pre>"));

关于PHP Tidy删除空格并插入换行符,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/15147711/

10-13 23:08