通过PHP输出XML数据,给出致命的错误


Outputting XML data via PHP giving fatal error's

我已经从以前版本的网站(它是一个自定义CMS)获得了数据,并希望将其导入到我的Wordpress网站的状态。

这就是我正在做的事情 - http://www.teamworksdesign.com/clients/ciw/datatest/index.php。如果向下滚动到第 187 行,数据将开始失败(应该有一条红色消息),并显示以下错误消息:

致命错误:未捕获的异常"异常",消息"字符串可能" 不解析为 XML' /home/teamwork/public_html/clients/ciw/datatest/index.php:132 堆栈 跟踪:#0 /home/teamwork/public_html/clients/ciw/datatest/index.php(132): SimpleXMLElement->__construct('

任何人都可以看到问题是什么以及如何解决它吗?

这就是我输出日期的方式:

<!DOCTYPE html>
<html>
<head>
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
</head>
<body>
<?php

ini_set('memory_limit','1024M');
ini_set('max_execution_time', 500); //300 seconds = 5 minutes
echo "<br />memory_limit: " .  ini_get('memory_limit') . "<br /><br />";
echo "<br />max_execution_time: " .  ini_get('max_execution_time') . "<br /><br />";
libxml_use_internal_errors(true); 
$z = new XMLReader;
$z->open('dbo_Content.xml');
$doc = new DOMDocument;
$doc->preserveWhiteSpace = false;
// move to the first <product /> node
while ($z->read() && $z->name !== 'dbo_Content');
$c = 0;
// now that we're at the right depth, hop to the next <product/> until the end of the tree
while ($z->name === 'dbo_Content')
{
    if($c < 201) {
        // either one should work
        $node = simplexml_import_dom($doc->importNode($z->expand(), true));
        if($node->ClassId == 'policydocument') {
            $c++;
            echo "<h1>Row: $c</h1>";
            echo "<pre>";
            echo htmlentities($node->XML) . "<br /><br /><br /><b>*******</b><br /><br /><br />";
            echo "</pre>";
            try{ 
                $xmlObject = new SimpleXMLElement($node->XML);
                foreach ($xmlObject->fields[0]->field as $field) {
                    switch((string) $field['name']) {
                        case 'parentId':
                            echo "<b>PARENT ID: </b> " . $field->value . "<br />";
                            break;
                        case 'title':
                            echo "<b>TITLE: </b> " . $field->value . "<br />";
                            break;
                        case 'summary':
                            echo "<b>SUMMARY: </b> " . $field->value . "<br />";
                            break;
                        case 'body':
                            echo "<b>BODY:</b> " . $field->value . "<br />";
                            break;
                        case 'published':
                             echo "<b>PUBLISHED:</b> " . $field->value . "<br />";
                             break;
                    }
                }
                echo '<br /><h2 style="color:green;">Success on node: '.$node->ContentId.'</h2><hr /><br />';           
            } catch (Exception $e){ 
                echo '<h2 style="color:red;">Failed on node: '.$node->ContentId.'</h2>'; 
            }
        }
        // go to next <product />
        $z->next('dbo_Content');
    }

} ?>
</body>
</html>

您收到的错误消息"字符串无法解析为 XML"意味着 XML 解析器在输入数据中发现了无效 XML 的内容。

您没有向我们展示数据,所以我无法确切地告诉您什么是无效的,但是其中的某些内容不符合 XML 解析的严格规则。造成这种情况的原因有很多。

如果我不得不伸出脖子并猜测,我会说在文件中出现错误 XML 的最常见原因,否则还可以,当它应该是&amp;实体代码时,这是一个未转义的&

任何使用适当的 XML 编写器创建 XML 的人都不应该遇到这个问题,但我遇到过很多情况,人们懒得使用 XML 编写器,只是将原始 XML 输出为文本,并且忘记了转义实体,这意味着数据很好,直到您找到带有&的公司名称。

如果它就这么简单,并且是一次性导入,则可以在文本编辑器中手动修复文件。

然而,这只是一个猜测。您需要亲自实际检查 XML 文件才能看到问题所在。如果您无法直观地看到问题,我建议您使用 GUI XML 工具来分析文件。

希望有帮助。

[编辑]

好的,我只是仔细查看了您提供的链接中的数据,并且像拇指酸痛一样突出......

encoding="utf-16"

我注意到所有有效的数据都使用 UTF-8,所有失败的数据都使用 UTF-16。

PHP 通常可以使用 UTF-8,但它根本无法很好地处理 UTF-16。所以很明显这是你的问题。

而且,老实说,真的没有必要使用 UTF-16,所以这里的解决方案是切换到 UTF-8 编码。

我不能说这对您来说有多容易,但最坏的情况是,我相信您可以找到批量转换工具。

希望有帮助。