Разбор XML на iPhone создан в PHP - PullRequest
       26

Разбор XML на iPhone создан в PHP

3 голосов
/ 25 февраля 2010

Я пытаюсь проанализировать строку XML с NSXMLParser, который я создал в PHP. Мой PHP-скрипт:

$doc = new DomDocument('1.0');
//$doc->preserveWhiteSpace=false;
$root = $doc->createElement("root");
$root = $doc->appendChild($root);
$child = $doc->createElement("child");
$child = $root->appendChild($child);
$value = $doc->createTextNode("testvar");
$value = $child->appendChild($value);
$xml_string = $doc->saveXML();
print $xml_string;

Если я открою страницу в браузере, она покажет мне «testvar», как и должно быть. Показывая источник, он показывает мне, что есть несколько пробелов:

begin ->| <?xml version="1.0"?>
<root><child>testvar</child></root>
    |<--end

Установка для preserveWhitespace значения false ничего не меняет. Поэтому я попытался с регулярным выражением в PHP:

$xml_string1 = preg_replace("/\s+</","<",$xml_string);
$xml_string2 = preg_replace("/>\s+/",">",$xml_string1);
print $xml_string2;

Это удаляет \ n и подводит меня к этому

begin-->| <?xml version="1.0"?><root><child>testvar</child></root>  |<--end

В браузере всегда показывает желаемый результат: testvar

На iphone я получаю следующую ошибку:

**NSXMLParserErrorDomain Code = 64, Operation could not be completed.**

Я не знаю, в чем проблема с XML, я получаю его правильно, как в разделе Это удаляет \ n ....

Я попытался отладить, но после запуска парсера с помощью [parser parse] не вызывается ни одна из функций делегата (да, я установил делегат), за исключением parserError. Поскольку до и после xml еще есть пробелы, возможно, в этом причина, но я не могу их вывести. В моем приложении на iPhone я пробовал разные кодировки, UTF8 и ASCII. Я также попытался преобразовать полученные данные в строку под названием

stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceAndNewlineCharacterSet

и преобразован обратно.

Я также установил следующее:

[parser setShouldProcessNamespaces:NO];
[parser setShouldReportNamespacePrefixes:NO];
[parser setShouldResolveExternalEntities:NO];

Я не знаю, что я делаю неправильно, пожалуйста, помогите.

Заранее спасибо.

Ответы [ 2 ]

1 голос
/ 25 февраля 2010

Спасибо за ответ, помог мне продолжить поиск нужной вещи. Я действительно не хочу удалять свою декларацию XML, так как я должен соответствовать стандартам. Я нашел ответ после того, как потратил 1,5 дня. PHP также использует аналогичные обозначения: <?php ... ?>. Обратите внимание, что конечный php ?> должен быть пропущен во всех файлах кода PHP - модулях, включаемых и т. Д. Закрывающий разделитель необязателен в PHP (но не в XML), и его удаление помогает предотвратить появление нежелательных пробелов в конце файлов что может вызвать проблемы. Я не знал об этом, после удаления закрывающего разделителя он работает просто отлично.

1 голос
/ 25 февраля 2010

Кажется, что на пути к NSXMLParser есть несколько ведущих пробелов. Я не вижу ничего в вставленном вами коде, который бы это делал, но:

  1. это PHP-скрипт, который выплевывает XML напрямую? Если это так, вы должны убедиться, что в начале файла нет пробелов в начале открывающего тега <?php.

  2. убедитесь, что в начале файла нет фиктивной UTF-8 "faux-BOM".

В любом случае, вероятно, самый простой способ продвинуться - полностью отказаться от XML-декларации. Пока вы используете XML 1.0 и UTF-8 (и так будет всегда), декларация XML не имеет смысла. Без объявления у вашего документа могут быть добавлены пробелы к началу, но при этом он будет правильно сформирован.

Вы должны быть в состоянии сделать это, передав опцию LIBXML_NOXMLDECL в saveXML, но я считаю, что в настоящее время это не работает. Вместо этого вы можете вызвать saveXML для каждого из childNodes документа и присоединиться к полученным строкам. Или, в общем случае, когда у вас нет никаких комментариев или инструкций по обработке за пределами корневого элемента, который вы хотите сохранить, вы можете просто сказать:

$xml_string = $doc->saveXML($doc->documentElement);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...