【问题标题】:Parsing XML on iPhone created in PHP在 iPhone 上解析用 PHP 创建的 XML
【发布时间】:2011-01-20 22:28:24
【问题描述】:

我正在尝试使用我在 PHP 中创建的 NSXMLParser 解析 xml 字符串。 我的 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 有什么问题,我可以正确接收它,就像在 This removes the \n .... 下一样。

我尝试调试,但是在使用 [parser parse] 启动解析器后,没有调用任何委托函数(是的,我设置了委托)除了 parserError。 由于 xml 前后仍有空格,可能这就是原因,但我无法将它们取出。 在我在 iPhone 上的应用程序中,我尝试了不同的编码,UTF8 和 ASCII。 我还尝试将接收到的数据转换为字符串,称为

stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceAndNewlineCharacterSet

并转换回来。

我还设置了以下内容:

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

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

提前致谢。

【问题讨论】:

  • 你用 PHP 创建了一部 iPhone?太棒了!

标签: php iphone objective-c xml parsing


【解决方案1】:

感谢您的回答,帮助我继续寻找正确的东西。我真的不想删除我的 XML 声明,因为我必须符合标准。在浪费了 1.5 天后,我找到了答案。 PHP 也使用类似的符号:&lt;?php ... ?&gt;。请注意,应从所有 PHP 代码文件(模块、包含等)中省略最后的 php ?&gt;。结束分隔符在 PHP 中是可选的(但在 XML 中不是),删除它有助于防止文件末尾出现不需要的空白这可能会导致问题。我没有意识到这一点,在删除结束分隔符后它工作得很好。

【讨论】:

    【解决方案2】:

    在通往 NSXMLParser 的途中似乎有一些领先的空间。我在您粘贴的代码中看不到任何可以做到这一点的东西,但是:

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

    2. 检查文件开头没有伪造的 UTF-8 “faux-BOM”。

    无论如何,最简单的方法可能是完全放弃 XML 声明。只要您使用 XML 1.0 和 UTF-8(而且您几乎总是会这样),XML 声明就毫无用处。如果没有声明,您的文档可以在开头添加空格,同时仍保持良好格式。

    您应该可以通过将LIBXML_NOXMLDECL 选项传递给saveXML 来做到这一点,但我相信目前这不起作用。您可以改为为文档的每个 childNodes 调用 saveXML 并加入结果字符串。或者,在您想要保留的根元素之外没有任何 cmets 或处理指令的常见情况下,您可以简单地说:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-10-05
      • 2011-04-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-03-16
      • 1970-01-01
      相关资源
      最近更新 更多