Разбор XML (в php) на iPhone - PullRequest
       18

Разбор XML (в php) на iPhone

0 голосов
/ 29 декабря 2011

Я занимаюсь разработкой приложения для iPhone и хочу добавить некоторые данные в UITableView.Я получил приложение, показывающее несколько запущенных парсеров 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];
}

Когда я создаю php в xml напрямую с echo, как это делается,

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

Приложение для iPhone анализирует этот код как XML.Но когда я делаю php to xml с запросом mySQL (потому что я хочу создать элементы 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 нет элемента.Что самое странное для меня, это то, что результаты в веб-браузере точно такие же.Когда я помещаю URL в браузер, сам вывод и источник (с функцией просмотра источника в браузере) абсолютно одинаковы.Это исходный вид в веб-браузере. (Плз, я не против проблемы кодирования)

<?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 и веб-программировании.Пожалуйста, дайте мне знать, в чем проблема и решение.Спасибо заранее!: D

1 Ответ

0 голосов
/ 29 декабря 2011

(Plz не возражает против некоторой проблемы с кодировкой)
Возможно, мы не против, но, вероятно, анализатор xml делает. Вы должны
  • установить mimetype в заголовке ответа http
  • установить кодировку в заголовке ответа http (хотя она уже есть в объявлении xml)
  • установить для клиента mysql encondig значение utf8, чтобы получать данные в кодировке utf-8
  • обработать все данные из базы данных с помощью соответствующей функции escape
  • или даже лучше использовать что-то вроде XMLWriter

и вам также следует печатать сообщения об ошибках в виде несколько действительного XML-документа, поскольку вы сказали клиенту, что он получит XML.

например. (проверено только 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>";
?>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...