2012-04-15 12 views
0

Es ist schwierig, XML zu analysieren, das mit POST aus einem Webformular erstellt wurde.NSXMLParser wirkt merkwürdig

Hier ist das Szenario:

1) Benutzer auf eine Web-Seite kommt, gibt seinen Namen in ein Textfeld, und Klicks Zustellen

2) ruft eine PHP-Datei (genannt „makeXML. php "), die eine XML-Datei generiert, die den Namen dieses Benutzers in einem Tag namens" currentUserName "

enthält 3) eine iPhone App lädt dann diese" makeXML.php "-Datei (mit 'loadXMLByURL') und analysiert sie, speziell auf Ausgabe des Inhalts des Tags "currentUserName" in ein UILabel-Objekt.

sollte ziemlich einfach sein - aber aus irgendeinem Grund, der Inhalt des „currentUserName“ Tag kommen leer im App up - obwohl sie sehr gut in der generierten XML-Code im Browser angezeigt.

Was ist noch seltsamer ist, dass, wenn ich stattdessen hart Code ein Wert auf „uName“ in der PHP-Datei („makeXML.php“) - wie (unter Verwendung von $ _POST gegen diesen Wert aus dem Formular zu bekommen [ "userName"];) - alles funktioniert einwandfrei. Ich kann den Wert aus dem Tag "currentUserName" abrufen und ihn an das UILabel-Objekt ausgeben.

NSXMLParser scheint aus irgendeinem Grund POST'ed Werte einfach nicht zu mögen.

Irgendwelche Ideen?

Hier ist der Code:

portal.html:

<html xmlns="http://www.w3.org/1999/xhtml"> 
<head> 
<title>Web-Form</title> 
</head> 

<body> 

<form name="form1" method="post" action="makeXML.php"> 
    <p>Enter your name:</p> 
    <p> 
    <input name="userName" type="text" /> 
    </p> 
    <p> 
    <input type="submit" value="SUBMIT" /> 
    </p> 
</form> 

</body> 
</html> 

Hier ist "makeXML.php":

<?php 
header("Content-type: text/xml"); 
echo "<?xml version=\"1.0\" encoding=\"UTF-8\" ?>"; 

echo "<document>"; 

$uName = $_POST["userName"]; 

echo "Here is the name you typed:"; 
echo "<br/>"; 
echo "<theUsersName>$uName</theUsersName>"; 

echo "</document>"; 

?> 

Hier ist der ausgegebene Code aus makeXML.php (Hinweis: dass dieser Code in einer Zeile ausgegeben wird - soll das sein? Sollte das "br" Tag nicht funktionieren und einen Zeilenumbruch erzwingen?

Wieder
<?xml version="1.0" encoding="UTF-8" ?><document>Here is the name you typed:<br/><theUsersName>johnson</theUsersName></document> 

, beachten Sie, dass, wenn ich ersetzen:

$uName = $_POST["userName"]; 

mit Klar alt:

$uName = "John"; 

Alles perfekt und der Name "John" erscheint richtig in meine UILabel funktioniert .. .

+1

So ist ich im Laufe Ihres Szenarios, dass zu verstehen, gibt es * zwei * Anfragen an makeXML.php? Einer von einer Webseite, einer von einem iPhone? – QED

+0

Oh ja, ich denke schon - und das ist offensichtlich das Problem, nicht wahr? :-) Ursache Wenn die iPhone-App "makeXML.php" aufruft, wird diese Seite erneut verarbeitet - ohne jedoch einen Wert für "userName" anzugeben - was ein leeres Feld zurückgibt. Also, wie löse ich das? Muss ich eine Datenbank verwenden, um die Daten zu erhalten? Das bedeutet, dass der von der Webseite eingegebene "userName" in einer Datenbank gespeichert wird und die iPhone App dann ein anderes PHP-Skript aufruft, das die Datenbank liest und "userName" daraus abruft? Scheint so viel Arbeit für etwas ziemlich Einfaches. Gibt es keinen anderen Weg? – sirab333

+1

Es hängt davon ab, was Sie bauen. Das Problem ist, dass Sie nicht wirklich wissen, wonach Sie fragen - Sie dachten, es wäre ein XML-Parser-Problem, aber das Problem ist nicht mit XML-Parsing oder sogar PHP oder irgendetwas anderes - Ihr Problem ist zu verstehen, wie System als Ganzes passt zusammen und funktioniert. Sie müssen etwas lesen. – QED

Antwort

0

Wie psoft in seinen Kommentaren angespielt, ist es schwierig, eine Frage wie diese seit Ihrer en konkret zu beantworten d Ziel scheint etwas unklar. Ich gehe davon aus, dass Sie gerade anfangen, mit allen beteiligten Technologien zu experimentieren.

Ihr PHP Skript funktioniert, ich habe es auf meinem lokalen Apache-Server getestet. Obwohl es einige Kuriositäten gibt; Ein Beispiel ist das Einfügen eines html<br/> in XML. XML ist ein Datenformat (zumindest in diesem Zusammenhang), nicht wirklich für die Präsentation gedacht. Ihre html Datei funktioniert auch gut.

Es gibt drei sehr offensichtliche Möglichkeiten, von wo Sie sind.

1) Tun Sie, was Ihre obigen Kommentar sagt. Verwenden Sie ein Skript, um in eine Datenbank zu schreiben, und verwenden Sie dann ein anderes, um darauf zuzugreifen. Die erste von einer Webseite die zweite von objective-c code. Ich bin mir ziemlich sicher, dass dies nicht etwas ist, das du gerade ausprobieren willst.

2) Unterbrechen Sie das Senden des post von einem UIWebView in Ihrer Anwendung. Senden Sie diese Daten auf andere Weise an Ihren Server und parsen Sie die Ergebnisse.

3) Ignorieren Sie die Webansicht und senden Sie die Argumente direkt an den Server.

Beide 2 & 3 sind sehr verwandt. Der Hauptunterschied ist der Ursprung des NSURLRequest.

Für 2 ist es recht einfach, die Postanforderung zu erhalten. Zuerst würden Sie ein Objekt, sagen wir Ihr View-Controller, als den Delegaten der Web-View festlegen. Implementieren Sie dann die folgende Methode.

-(BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType{ 
    // Very simple example of checking for the php script in the url 
    if ([request.URL.absoluteString.lastPathComponent isEqualToString:@"makeXML.php"]){ 
     // Use the "request" parameter to 
     // post the request yourself 
     return NO; // Because you will handle it. 
    } else { 
     return YES; 
    } 
} 

Für 3, Sie einfach die NSURLRequest selbst erstellen und es für Ihre Bedürfnisse konfigurieren. Dies erfordert die Unterklasse NSMutableURLRequest.

NSString *nameToPost = @"Mr Ducky"; 

NSURL *url = [[NSURL alloc] initWithString:@"http://Address&FolderOfScriptHere/makeXML.php"]; 
NSMutableURLRequest *request = [[NSMutableURLRequest alloc] initWithURL:url]; 
request.HTTPMethod = @"POST"; 
[request setHTTPBody:[[NSString stringWithFormat:@"userName=%@",nameToPost] dataUsingEncoding:NSUTF8StringEncoding]]; 

Und dann in jedem Fall (2 oder 3) Sie request verwenden können, um die Daten zu laden analysiert werden. Hier ist zum Beispiel eine sehr schlechte (synchrone) Art, die Daten zu laden.

NSData *xmlData = [NSURLConnection sendSynchronousRequest:request returningResponse:nil error:nil]; 

Diese Daten können dann einfach angemeldet sein, um einen Parser oder zum Testen zugeführt werden:

NSString *xmlString = [[NSString alloc] initWithData:xmlData encoding:NSUTF8StringEncoding]; 
NSLog(@"xml:%@",xmlString); 
+0

Danke NJones :-) Ich ging mit der Lösung, die ich selbst vorgeschlagen hatte (und die Sie in Ihren 3 Optionen als Option # 1 gespiegelt) - die der Einreichung der übermittelten Daten in eine MySQL-Datenbank. Funktioniert sehr gut. Vielen Dank für Ihre Vorschläge - ich bin ziemlich sicher, dass sie sich für andere Teile dieses Projekts als nützlich erweisen werden. Prost! – sirab333