0

POSTを使用してWebフォームから作成されたXMLを解析するのに苦労しています。

シナリオは次のとおりです。

1)ユーザーがWebページにアクセスし、テキストフィールドに名前を入力して、[送信]をクリックします。

2)これはPHPファイル(「makeXML.php」と呼ばれる)を呼び出し、「currentUserName」と呼ばれるタグにそのユーザーの名前を含むXMLファイルを生成します。

3)次に、iPhoneアプリはこの「makeXML.php」ファイルを(「loadXMLByURL」を使用して)ロードして解析し、特に「currentUserName」タグの内容をUILabelオブジェクトに出力するようにします。

非常に単純なはずですが、何らかの理由で、「currentUserName」タグの内容はアプリでになりますが、ブラウザーで生成されたXMLコードでは完全に表示されます。

さらに奇妙なことに、フォームから値を取得するのではなく、PHPファイル( "makeXML.php")の "uName"に値をハードコーディングすると($ _POST ["userName"];) -それはすべて完全にうまく機能します。「currentUserName」タグから値を取得して、UILabelオブジェクトに出力することができます。

NSXMLParserは、何らかの理由でPOSTされた値を好まないようです。

何か案は?

コードは次のとおりです。

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>

これが「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>";

?>

makeXML.phpから出力されたコードは次のとおりです(このコードはすべて1行で出力されることに注意してください-それはどのように想定されているのですか?「br」タグが機能し、そこで改行を強制するべきではありませんか?)

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

繰り返しますが、交換する場合は次の点に注意してください。

    $uName = $_POST["userName"]; 

昔ながらの:

    $uName = "John"; 

すべてが完璧に機能し、「John」という名前が私のUILabelに正しく表示されます...

4

1 に答える 1

0

psoft彼のコメントでほのめかされているように、このような質問に具体的に答えるのは難しいです. 関連するすべてのテクノロジーを試し始めたところだと思います。

PHPスクリプトは機能します。ローカルの Apache サーバーでテストしました。いくつかの奇妙な点がありますが。に を挿入するhtml <br/>などXMLXML(少なくともこのコンテキストでは)データ形式であり、実際にはプレゼンテーションを目的としていません。あなたのhtmlファイルも正常に動作します。

あなたがいる場所から行くための3つの非常に明白な方法があります.

1)上記のコメントが言うことをしてください。スクリプトを使用してデータベースに書き込み、別のスクリプトを使用してデータベースにアクセスします。Web ページからの 1 つ目、objective-c コードからの 2 つ目。これはあなたが今すぐ試してみたいものではないと確信しています.

2)postアプリケーションで a からの送信を中断UIWebViewします。そのデータを別の方法でサーバーに送信し、結果を解析します。

3) Web ビューを無視し、引数を直接サーバーに送信します。

2と3の両方が非常に関連しています。主な違いは、NSURLRequest.

2 の場合、投稿リクエストを取得するのは非常に簡単です。まず、ビュー コントローラーなどのオブジェクトを Web ビューのデリゲートとして設定します。次に、次のメソッドを実装します。

-(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;
    }
}

NSURLRequest3 については、自分で作成し、ニーズに合わせて構成するだけです。これには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]];

そして、どちらの場合でも (2 または 3) request、解析するデータをロードするために使用できます。たとえば、データをロードするための非常に悪い (同期) 方法を次に示します。

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

次に、このデータをパーサーにフィードするか、テストのために単純にログに記録することができます。

NSString *xmlString = [[NSString alloc] initWithData:xmlData encoding:NSUTF8StringEncoding];
NSLog(@"xml:%@",xmlString);
于 2012-04-15T16:58:18.413 に答える