【问题标题】:How to fix XML "Opening and ending tag mismatch error"?如何修复 XML“开始和结束标签不匹配错误”?
【发布时间】:2014-10-19 01:33:41
【问题描述】:

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

有什么想法吗?

【问题讨论】:

  • 坏线是什么样子的?
  • 听起来更像是 HTML 而不是 XML。即使不是,解析 HTML 的工具也可能更宽容,因为它通常不会将未关闭的元素视为错误。 &lt;br&gt; 没有 &lt;/br&gt; 是完全有效的 HTML。

标签: php xml xml-parsing


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

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

    请检查您的结束标签。

    例如这应该是正确的。

    $xml.="</childelement>";
    

    代替

    $xml.="<childelement/>";
    

    【讨论】:

      猜你喜欢
      • 2021-09-23
      • 2012-09-29
      • 2016-08-27
      • 2016-09-15
      • 1970-01-01
      • 2012-04-01
      • 2011-11-02
      • 1970-01-01
      • 2013-05-24
      相关资源
      最近更新 更多