如何修复XML“打开和结束标记不匹配错误”?

时间:2014-08-25 20:19:30

标签: php xml xml-parsing

我正在尝试修复包含数千行错误的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));
         }
     }

有什么想法吗?

2 个答案:

答案 0 :(得分:2)

首先,如果您有损坏的数据,那么修复生成它的程序通常比修复数据更重要。

如果文件中的唯一错误是不匹配的结束标记,则可能修复策略是完全忽略结束标记中的内容,因为XML结束标记中出现的名称是多余的。您可能会发现TagSoup或validator.nu等现有工具以您希望的方式处理此问题;或者你可能会发现这样一个工具输出的XML可以转换成你想要的形式。这比为这种非XML语法编写自己的解析器更好。

答案 1 :(得分:-1)

我认为这是一个简单的解决方案。

请检查结束标记。

例如,这应该是正确的。

$xml.="</childelement>";

而不是

$xml.="<childelement/>";