2017-01-27 6 views
0

私は知っています。それは有効なXMLではありません。複数のルートノードがある場合、libxmlはすべてのコンテンツを解析します

残念ながら、これはlibxmlを利用したPHPソースコードのバグを回避するためのものです。

PHPのloadHTML関数は、偶発的に警告なしのフラグとエラーフラグを上書きしないので、これらのオプションを渡すと決してlibxmlにはなりません。

PHPのloadXMLはではないと同じ間違いをします。すべてのフラグは期待どおりに動作します。だから私は今の代わりにloadXMLを使用して探しています。残念なことに、loadXMLは単一のルートノードの後に​​解析を停止するため、テンプレートスニペットやウィジェットをロードするのには適していません。だから...

<!--My title snippet --> 
<h1>${{ title }}</h1> 
<h4>${{ subtitle }}</h4> 

は、loadXMLで部分的にのみロードされます。 libxmlのパーサに強制的に続行させるオプションフラグはありますか?また、すべてのスニペットをルートノードでラップする必要がありますか?

私はバグを歩き回るの他の方法を模索しています。たとえば、LIBXML_USE_INTERNAL_ERRORS(true)を使用するか、出力バッファーで警告をキャッチしてクリアします。どちらもうまくいきますが、どちらも満足のいくものではありません。なぜなら、警告とエラーを私が欲しくない記憶に書き込むからです。

+0

'libxml_use_internal_errors'の問題点は何ですか?警告とエラーは 'libxml_clear_errors'でクリアすることができます。 – nwellnhof

答えて

1

対応するlibxml2の機能は、xmlParseBalancedChunkMemoryです。この関数がPHP APIによって間接的に公開される場所は、DOMDocumentFragment::appendXMLです。

$doc = new DOMDocument(); 
$fragment = $doc->createDocumentFragment(); 
$fragment->appendXML('<h1>H1</h1><h4>H4</h4>'); 
print $doc->saveXML($fragment); 

しかし、あなたはHTMLを解析しようとしている場合、あなたはおそらくトラブルに実行されます。

+0

もちろん、他の解析オプションはappendXMLでは利用できません。 PHPパッチが完全に配布されるまで待ちます。 – user2782001

関連する問題