views:

366

answers:

3

Hello,

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.

+1  A: 

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);
bobince
+1  A: 

Thanks for the answer, helped me continuing to search for the right thing. I don't really wanna delete my xml declaration as i have to be conforming to standards. Found the answer after wasting 1.5 days. PHP also uses a similar notation: . Note that the final php ?> should be omitted from all PHP code files—modules, includes, etc. The closing delimiter is optional in PHP (but not in XML), and removing it helps prevent unwanted white space at the end of files which can cause problems I wasn't aware of that, after removing the fxxxxxxx closing delimiter it works just fine.

Matt
+1  A: 

Thanks It make my application rocks

Mahek