web-dev-qa-db-ja.com

XMLの「タグの開始と終了の不一致エラー」を修正するにはどうすればよいですか?

エラーのある数千行のXMLファイルを修正しようとしています。

タグの開始と終了の不一致エラー

現在、simpleXMLを使用してこのファイルを解析しているため、このライブラリで解析する前に、XMLファイルを修正する必要があります。

現在、私はこのソリューションを試していますが、それだけでは十分ではありません。

libxml_use_internal_errors(true);
$xml = @simplexml_load_file($temp_name);
     $errors = libxml_get_errors();
     foreach ($errors as $error) {
         if (strpos($error->message, 'Opening and ending tag mismatch')!==false) {
             $tag   = trim(preg_replace('/Opening and ending tag mismatch: (.*) line.*/', '$1', $error->message));
             $lines = file($temp_name, FILE_IGNORE_NEW_LINES);
             $line  = $error->line+1;
             echo $line;
             echo "<br>";
             $lines[$line] = '</'.$tag.'>'.$lines[$line];
             file_put_contents($temp_name, implode("\n", $lines));
         }
     }

何か案が?

7
rguzmanrosales

まず、破損したデータがある場合は、それを生成したプログラムを修正することが、通常、データを修復するよりも重要です。

ファイル内の唯一のエラーが不一致の終了タグである場合、XML終了タグに表示される名前が冗長であることを考えると、おそらく修復戦略は終了タグ内の内容を完全に無視することです。 TagSoupやvalidator.nuなどの既存のツールがこれを希望どおりに処理する場合があります。または、そのようなツールがXMLを出力し、それを必要な形式に変換できる場合があります。これは、この非XML文法用に独自のパーサーを作成するよりも良い見通しです。

2
Michael Kay