在iPhone上解析XML(在PHP中)

时间:2011-12-29 11:35:03

标签: php iphone mysql xml xml-parsing

我正在开发一个iPhone应用程序,我想把一些数据放到UITableView。 我有一个应用程序显示从here运行的几个xml解析器。

然后,我将GDataXMLParser与该项目分开并使其运行但是 我有一个奇怪的问题,我无法弄清楚。

这是放入php文件的代码。

- (void)start {
    self.startTimeReference = [NSDate timeIntervalSinceReferenceDate];
    [[NSURLCache sharedURLCache] removeAllCachedResponses];
    self.parsedSongs = [NSMutableArray array];
    NSURL *url = [NSURL URLWithString:@"http://mydomain.blabla/phpxmltest.php"];
    [NSThread detachNewThreadSelector:@selector(downloadAndParse:) toTarget:self withObject:url];
}

当我直接使用echo创建一个php到xml时,就像这样,

......
echo "<entry><title>this is the TEST</title><item>TEST</item></entry>";
......

iPhone应用程序会像XML一样解析此代码。 但是当我使用mySQL查询创建一个php到xml(因为我想从DB创建一个xml项目)时,就像这样,

<?php
echo '<?xml version="1.0" encoding="UTF-8"?>';
$result = mysql_connect("localhost", "my ID", "my Password");
mysql_select_db("my DB");
$q = "select name, price, age, likeit, keyword from Table where category=101";
$result = mysql_query($q);
$num_rows = mysql_num_rows($result);

echo "<entry>\n";
for ($i=1; $i<=$num_rows; $i++) {
    $row = mysql_fetch_assoc($result);
    echo "<item>\n";
    echo "<title>" . $row["name"] . "</title>\n";
    echo "<category>" . $row["price"] . "</category>\n";
    echo "<artist>" . $row["age"] . "</artist>\n";
    echo "<album>" . $row["likeit"] . "</album>\n";
    echo "<releasedate>" . $row["keyword"] . "</releasedate>\n";
    echo "</item>\n";
}
echo "</entry>";
?>

iPhone应用程序无法解析此代码。它告诉我XML中没有项目。 对我来说最奇怪的是,Web浏览器上的结果完全相同。 当我将URL放在浏览器中时,输出本身和源(具有浏览器的查看源功能)完全相同。这是Web浏览器中的源视图。(Plz不介意一些编码问题)

<?xml version="1.0" encoding="UTF-8"?>
<entry>
<item>
<title>������ ���ĺ� ������</title>
<category>11000</category>
<artist>3</artist>
<album>0</album>
<releasedate>���ĺ� ���߱�</releasedate>
</item>
<item>
<title>���ĺ� ��������</title>
<category>18000</category>
<artist>3</artist>
<album>0</album>
<releasedate>���ĺ� ����</releasedate>
</item>
…..

我努力使它成功但对我来说太难了。我是iOS和Web编程的先驱。请让我知道问题和解决方案是什么。 提前谢谢你!:D

1 个答案:

答案 0 :(得分:0)

(Plz不介意一些编码问题)
也许我们不介意,但xml解析器可能会这样做。
你应该

  • 在http响应标头中设置mimetype
  • 在http响应头中设置charset(虽然它已经在xml声明中)
  • 将mysql的客户端encondig设置为utf8以便接收utf-8编码的数据
  • 使用适当的转义函数处理数据库中的所有数据
  • 甚至更好地使用XMLWriter
  • 之类的东西

并且您还应该将错误消息打印为有点有效的xml文档,因为您告诉客户端它将接收xml。

E.g。 (仅由php -l测试):

<?php
if ( headers_sent() ) {
  die("can't set mimetype and/or charset after output has been sent to the client");
}
ini_set('default_charset', 'utf-8');
ini_set('default_mimetype', 'text/xml');
// ini_set('default_mimetype', 'application/xml');

echo '<?xml version="1.0" encoding="UTF-8"?>';

$mysql = mysql_connect("localhost", "my ID", "my Password");
if ( !$mysql ) {
    die('<error>database connection failed</error>');
}

if ( !mysql_select_db("my DB", $mysql) ) {
    die('<error>database selection failed</error>');
}

if ( !mysql_set_charset('utf8', $mysql) ) {
    die('<error>setting database selectiocharset failed</error>');
}

$q = 'SELECT name, price, age, likeit, keyword FROM Table WHERE category=101';
$result = mysql_query($q, $mysql);
if ( !$result ) {
    die('<error>database query failed</error>');
}


echo "<entry>\n";
while( false!=($row=mysql_fetch_assoc($result)) ) {
    echo '
        <item>
            <title>',  htmlspecialchars($row["name"], 'utf-8'), '</title>
            <category>', htmlspecialchars($row["price"], 'utf-8'), '</category>
            <artist>', htmlspecialchars($row["age"], 'utf-8'), '</artist>
            <album>', htmlspecialchars($row["likeit"], 'utf-8'), '"</album>
            <releasedate>',  htmlspecialchars($row["keyword"], 'utf-8'), '</releasedate>
        </item>';
}
echo "</entry>";
?>