8

PHP Tidyを使用して、DomDocumentにロードする前にxmlが有効であることを確認したいと思います。

ただし、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;
    }

いくつかのオプションを変更しようとしましたが、成功しませんでした。

4

2 に答える 2

5

私は解決策を見つけましたが、それは少しハックなので、私はまだより良い提案を開いています。

検証<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>"));
于 2013-03-01T21:25:47.933 に答える
1

私の場合、htmlで置換を実行して、複数の空の行を削除し、Tidyがブレークを追加しないようにすることができました。$html = preg_replace("/\n([\s]*)\n/", "\r\n", $html);

于 2014-12-08T19:24:31.117 に答える