Laravel-DOMDocument::loadXML():开头和结尾标记不匹配-PhpWord错误


Laravel - DOMDocument::loadXML(): Opening and ending tag mismatch - PhpWord error

我有3个用HTML编写的Blade文件,我目前正在使用WKHTMLTOPDF将它们导出为PDF格式,我现在想将相同的HTML文件导出为Word文档。

到目前为止,我能找到的最好的Laravel软件包是PhpWord。

代码段:

<div class="page-break"></div>
<h3>Introduction</h3>
<p></p>
<p></p>

到目前为止我的代码:

$phpWord = new 'PhpOffice'PhpWord'PhpWord();
$section = $phpWord->addSection();    
$report = view('reports.audit-report', $data)->render();
'PhpOffice'PhpWord'Shared'Html::addHtml($section, $report, true);
$objWriter = 'PhpOffice'PhpWord'IOFactory::createWriter($phpWord, 'Word2007');
$objWriter->save('helloWorld.docx');

它当前正在返回此错误:

DOMDocument::loadXML():开头和结尾标记不匹配:链接行1和实体中的div,行:1

令人讨厌的是,无论我删除哪一行,错误总是持续存在,直到我删除了HTML的每一行!

我可以通过使用以下代码来防止这个错误的发生:

libxml_use_internal_errors(true);

然而,它返回:

Html.php第136行出现ErrorException:正在尝试获取非对象的属性

以前有人成功解决过这些错误吗?如果你需要更多的代码,请告诉我。非常感谢。

我也面临同样的问题。我已经按照下面的代码修复了它。

$doc = new DOMDocument();
$doc->loadHTML($str);
$doc->saveHTML();
'PhpOffice'PhpWord'Shared'Html::addHtml($section, $doc->saveHtml(),true);

方法addHtml()将提供的字符串加载为XML。这意味着它也需要是有效的XML。换句话说,您将不得不使用XHTML。

错误消息表明您在第1行中有一个link标记。link是(X)HTML中的一个空元素。保存为HTML,它看起来像这样:

<link rel="stylesheet" type="text/css" href="style.css">
<div>Some Content</div>

这不是有效的XML,原因有二。这里没有根元素,但它是由addHtml()添加的,并且link元素没有关闭,从而触发错误。

一个有效的XHTML片段如下所示:

<link rel="stylesheet" type="text/css" href="style.css"></link>
<div>Some Content</div>

或者这个:

<link rel="stylesheet" type="text/css" href="style.css"/>
<div>Some Content</div>

在XML中,空标记可以写成<link></link><link/>>之前的/直接关闭了打开标签。只有开头标记在XML/XHTML中无效,但在HTML中有效。

因此,您需要确保Blade文件是有效的XHTML片段。