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

Posted

技术标签:

【中文标题】如何修复 XML“开始和结束标签不匹配错误”?【英文标题】:How to fix XML "Opening and ending tag mismatch error"? 【发布时间】: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。 【参考方案1】:

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

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

【讨论】:

【参考方案2】:

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

请检查您的结束标签。

例如这应该是正确的。

$xml.="</childelement>";

代替

$xml.="<childelement/>";

【讨论】:

以上是关于如何修复 XML“开始和结束标签不匹配错误”?的主要内容,如果未能解决你的问题,请参考以下文章

解析XML时出错:找不到元素 - 如何修复此错误?

从源代码安装 PHP 时如何修复找不到 xml2-config 的错误?

如何修复在番石榴错误中找不到的配置

如何修复“无法解决 xamarin android 中“System.Xml”之间的冲突?

如何修复解析 XML:android 中的未绑定前缀

如何修复此 SELECT 语句中的错误 INTO 子句