在我的网站上,我为开发测试提供了大量内部跟踪信息。跟踪的内容是针对HTML格式化的,大部分时间都很好,但为了支持AJAX,有时我想将跟踪数据包含在XML文档中。有时,XML对象具有不匹配的标记,但它仅报告文档中缺少结束标记的位置。这些跟踪文档通常为10,000行,并且由整个系统的代码生成,因此调试调试信息非常重要。在我当前的问题中,XML解析报告我错过了一个结束< / p>。
所以我补充道:
libxml_use_internal_errors(true);
$doc = simplexml_load_string($warn);
$xml = explode("\n", $warn);
if (!$doc) {
$errors = libxml_get_errors();
foreach ($errors as $error) {
echo display_xml_error($error, $xml);
}
libxml_clear_errors();
}
到跟踪数据发送到stdout的位置。现在我明白了:
<p>User::__construct(Array
-^
Fatal Error 5: Extra content at the end of the document
Line: 2
Column: 1
--------------------------------------------
<div id='debugTrace' class='warning'>
<p>connection established to database server 'mysql:...'.</p>
<p>User::__construct(Array
(
[username] => jcobban
)
)</p>
<p>SELECT * FROM Users WHERE UserName='jcobban'</p><p class='label'>User Record constructed:</p>
... for 9997 more lines
&lt; div&gt;用于将所有跟踪输出封闭在类中,将输出设置为深黄色。
Firefox和PHP简单XML中的XML解析器都同意缺少结束&lt; / p&gt;,但是我看到结果文档中的结束标记,当我要求XML显示页面源时显示。发出明显违规行的代码行是:
$warn .= "<p>User::__construct(" . print_r($parms, true) .
")</p>\n";
那么我做错了什么?
答案 0 :(得分:2)
CDATA允许您将字符渲染到xml文档中,否则会破坏它。
$warn .= "<p><![cdata[User::__construct(" . print_r($parms, true) .
")]]></p>\n";
此处提供的有关SO的信息更多信息:What does <![CDATA[]]> in XML mean?
答案 1 :(得分:0)
当我能够使用更小的诊断生成错误时,我发现问题是我没有提供根标记。
$doc = simplexml_load_string($warn); // this fails
$doc = simplexml_load_string('<div>' . $warn . '</div>'); // this works