通过PHP输出XML数据会产生致命错误

时间:2013-11-11 09:19:28

标签: php xml

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

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

  

致命错误:未捕获的异常'异常',消息'字符串可以   不被解析为XML'   /home/teamwork/public_html/clients/ciw/datatest/index.php:132 Stack   追踪:#0   /home/teamwork/public_html/clients/ciw/datatest/index.php(132):   SimpleXMLElement-> __构建体(”

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

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

<!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>

1 个答案:

答案 0 :(得分:1)

您收到的错误消息“ String无法解析为XML ”意味着XML解析器在输入数据中发现了一些不是有效XML的内容。

您尚未向我们展示数据,因此我无法确切地告诉您什么是无效的,但其中的某些内容未能满足XML解析的严格规则。有很多可能的原因。

如果我不得不把我的脖子放在线上并且猜测,我会说在文件中间导致错误的XML的最常见原因是否可以是未转义的&应该是&amp;实体代码。

任何使用正确的XML编写器创建XML的人都不应该有这个问题,但是我遇到过很多人们不打扰使用XML编写器而只是输出原始XML作为文本而忘记逃避的情况实体,这意味着数据没有问题,直到您找到其中包含&的公司名称。

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

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

希望有所帮助。

<强> [编辑]

好的,我只是更好地查看了你给出的链接中的数据,而且事情就像拇指一样疼痛......

encoding="utf-16"

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

对于UTF-8,PHP通常很好,但是使用UTF-16根本不能很好地应对。所以很明显这是你的问题。

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

你做的有多容易,我不能说,但最糟糕的情况是我确定你能找到一个批量转换工具。

希望有所帮助。