我正在尝试使用我在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];
我不知道我做错了什么,请帮忙。
提前致谢。
答案 0 :(得分:1)
似乎有一些领先的空间即将进入NSXMLParser。我在你粘贴的代码中看不到任何可以做到的东西,但是:
这是一个直接吐出XML的PHP脚本吗?如果是这样,您需要确保在打开<?php
标记之前文件的开头没有空格。
检查文件开头是否存在伪造的UTF-8'faux-BOM'。
无论如何,最简单的方法可能是完全删除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中),删除它有助于防止不需要的空白区域可能导致问题的文件。我没有意识到这一点,在删除结束分隔符后,它工作得很好。