2

ユーザーが生成したソースからの XML フィードを解析するスクリプトがあります。このソースには、特殊文字を含む不適切な形式のエントリが含まれることがあります。

通常は行で utf8_encode() を実行するだけですが、DOM がファイルを徐々に読み取っていて、展開コマンドが実行されるとエラーがスローされるため、これを行う方法がわかりません。

simple_xml がコードを詰まらせているため、後続の行もオフになっています。

これがコードです。

$z = new XMLReader; 
$z->open($filename); $doc = new DOMDocument('1.0','UTF-8');         
while ($z->read() && $z->name !== 'product');   
while ($z->nodeType == XMLReader::ELEMENT AND $z->name === 'product'){
$producti = simplexml_import_dom($doc->importNode($z->expand(), true));
print_r($producti);
}

エラー:

メッセージ: XMLReader::expand(): foo.xml:29081: パーサー エラー: 入力が適切な UTF-8 ではありません。エンコーディングを示してください! バイト: 0x05 0x20 0x2D 0x35

重大度: 警告

メッセージ: XMLReader::expand(): 展開中にエラーが発生しました

ファイル名: controllers/feeds.php

ライン番号: 106

メッセージ: DOMDocument::importNode() に渡される引数 1 は DOMNode のインスタンスでなければなりません。

ファイル名: controllers/feeds.php

ライン番号: 106

4

1 に答える 1

1

最初に HTML Tidy ライブラリを使用して、文字列をきれいにします。

また、XMLReader の代わりに DOMDocument を使用することをお勧めします。

そんな感じ:

        $tidy = new Tidy;

        $config = array(
                'drop-font-tags' => true,
                'drop-proprietary-attributes' => true,
                'hide-comments' => true,
                'indent' => true,
                'logical-emphasis' => true,
                'numeric-entities' => true,
                'output-xhtml' => true,
                'wrap' => 0
        );

        $tidy->parseString($html, $config, 'utf8');

        $tidy->cleanRepair();

        $xml = $tidy->value; // Get clear string

        $dom = new DOMDocument;

        $dom->loadXML($xml);

        ...
于 2012-04-16T06:11:47.017 に答える