在PHP中查找不匹配的标记时遇到问题

时间:2017-10-30 22:11:26

标签: php xml

在我的网站上,我为开发测试提供了大量内部跟踪信息。跟踪的内容是针对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";

那么我做错了什么?

2 个答案:

答案 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