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

问题描述 投票:0回答:3

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

有什么想法吗?

php xml xml-parsing
3个回答
2
投票

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

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


0
投票

当我在内容中包含

<
(在开始标签和结束标签之间)时,我大多会收到此错误:

在内容中提及由 <

>
 包围的 
会产生错误。

在内容中提及由 &lt;

>
 包围的 
不会给出错误。


-1
投票

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

请检查您的结束标签。

例如,这应该是正确的。

$xml.="</childelement>";

而不是

$xml.="<childelement/>";
© www.soinside.com 2019 - 2024. All rights reserved.