在用PHP创建的iPhone上解析XML

时间:2010-02-25 09:36:04

标签: php iphone objective-c xml parsing

我正在尝试使用我在PHP中创建的NSXMLParser解析xml字符串。 我的PHP sript是:

$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]启动解析器后,没有调用任何委托函数(是的,我设置了委托)exept的parserError。 因为在xml之前和之后仍有空格可能这是原因,但我无法将它们解决。 在我的iPhone应用程序中,我尝试了不同的编码,UTF8和ASCII。 我还尝试将接收到的数据转换为一个名为

的字符串
stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceAndNewlineCharacterSet

并转回来。

我还设置了以下内容:

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

我不知道我做错了什么,请帮忙。

提前致谢。

2 个答案:

答案 0 :(得分:1)

似乎有一些领先的空间即将进入NSXMLParser。我在你粘贴的代码中看不到任何可以做到的东西,但是:

  1. 这是一个直接吐出XML的PHP​​脚本吗?如果是这样,您需要确保在打开<?php标记之前文件的开头没有空格。

  2. 检查文件开头是否存在伪造的UTF-8'faux-BOM'。

  3. 无论如何,最简单的方法可能是完全删除XML声明。只要您使用XML 1.0和UTF-8(并且几乎总是如此),XML声明就没有用处。如果没有声明,您的文档可以在开头时添加空格,同时仍然是格式良好。

    您应该可以将LIBXML_NOXMLDECL选项传递给saveXML,但我认为目前无效。您可以为每个文档的saveXML调用childNodes,然后加入生成的字符串。或者,在您希望保留的根元素之外没有任何注释或处理指令的常见情况下,您可以简单地说:

    $xml_string = $doc->saveXML($doc->documentElement);
    

答案 1 :(得分:1)

感谢您的回答,帮助我继续寻找正确的事情。我真的不想删除我的XML声明,因为我必须遵守标准。浪费了1.5天后我找到了答案。 PHP也使用类似的表示法:<?php ... ?>。请注意,最终的PHP ?>应该从所有PHP代码文件中省略 - 模块,包含等。结束分隔符在PHP中是可选的(但不是在XML中),删除它有助于防止不需要的空白区域可能导致问题的文件。我没有意识到这一点,在删除结束分隔符后,它工作得很好。