Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Parsing XML on iPhone created in PHP

i'm trying to parse a xml string with NSXMLParser which i created in PHP. My PHP sript is:

$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;

If i open the page in the browser it shows me 'testvar' like it should. Showing the source it shows me that there're several whitespaces:

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

Setting preserveWhitespace to false doesn't change anything. So i tried with regex in php:

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

This removes the \n and brings me to this

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

In the browser it always shows the wanted result: testvar

On the iphone i get following error:

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

I don't know whats the problem with the xml, i receive it correctly like under This removes the \n ....

I tried to debug but after starting the parser with [parser parse] none of the delegate functions is called (yes, i set the delegate) exept the parserError. As there're still spaces before and after the xml may this is the reason, but i can't get them out. In my application on the iPhone i tried different encodings, UTF8 and ASCII. I also tried to convert the received data to a string, called

stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceAndNewlineCharacterSet

and converted back.

I also set the following:

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

I don't know what i'm doing wrong, please help.

Thanks in advance.

like image 334
Matt Avatar asked Dec 21 '25 00:12

Matt


1 Answers

There seem to be some leading spaces coming in en route to the NSXMLParser. I can't see anything in the code you have pasted that would do that, but:

  1. is this a PHP script spitting out XML directly? If so, you need to ensure that there is no whitespace at the start of the file before your opening <?php tag.

  2. check that there isn't a bogus UTF-8 ‘faux-BOM’ at the start of the file.

Anyhow, probably the easiest way forward would be to drop the XML Declaration completely. As long as you are using XML 1.0 and UTF-8 (and you almost always will be), the XML Declaration serves no purpose. Without the declaration, your document can have whitespace added to the start whilst still being well-formed.

You should be able to do this by passing the LIBXML_NOXMLDECL option to saveXML, but I believe that currently doesn't work. You can instead call saveXML for each of the document's childNodes and join the resulting strings. Or, in the common case that you don't have any comments or processing instructions outside the root element that you want to keep, you can simply say:

$xml_string = $doc->saveXML($doc->documentElement);
like image 153
bobince Avatar answered Dec 22 '25 15:12

bobince