在iPhone上解析使用PHP创建的XML

3

我将尝试使用NSXMLParser解析一个由PHP创建的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的问题在哪里,我正确地接收到了它,如下所示:这将删除\n....

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

stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceAndNewlineCharacterSet

并转换回去。

我还设置了以下内容:

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

我不知道我做错了什么,请帮助我。
提前致谢。

1
你用PHP创建了一个iPhone?太神奇了! - Johannes Gorset
2个回答

1

在前往NSXMLParser的途中似乎有一些前导空格。我在你贴出的代码中没有看到任何可能会这样做的内容,但:

  1. 这是一个直接输出XML的PHP脚本吗?如果是,你需要确保在你的开头<?php标签之前没有空格。

  2. 检查一下文件开头是否有虚假的UTF-8‘faux-BOM’。

无论如何,最简单的方法可能是完全放弃XML声明。只要你使用的是XML 1.0和UTF-8(你几乎总是会这么做),XML声明就没有任何用处。没有声明,你的文档可以在开头添加空格而仍然是格式正确的。

你可以通过将 LIBXML_NOXMLDECL 选项传递给 saveXML 来实现这一点,但我认为目前不起作用。相反,您可以针对文档的每个 childNodes 调用 saveXML 并连接生成的字符串。或者,在您没有任何注释或处理指令在根元素之外需要保留的常见情况下,您可以简单地说:
$xml_string = $doc->saveXML($doc->documentElement);

1

感谢您的回答,帮助我继续寻找正确的方法。我不想删除我的XML声明,因为我必须符合标准。浪费了1.5天后,我找到了答案。PHP也使用类似的符号:<?php ... ?>。请注意,所有PHP代码文件(模块、包含等)都应省略最终的php ?>。在PHP中,结束定界符是可选的(但在XML中不是),删除它有助于防止文件末尾的不必要的空格引起问题。我之前不知道这一点,删除结束定界符后,它可以正常工作。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接