NSXMLParser行为奇怪

时间:2012-04-15 02:49:54

标签: php iphone xml post nsxmlparser

很难解析使用POST从网络表单创建的XML。

以下是该方案:

1)用户进入网页,将其姓名输入文本字段,然后点击提交

2)这会调用一个PHP文件(称为“makeXML.php”),该文件在名为“currentUserName”的标记中生成一个包含该用户名的XML文件

3)iPhone应用程序然后加载这个“makeXML.php”文件(使用'loadXMLByURL')并解析它,专门用于将“currentUserName”标记的内容输出到UILabel对象中。

应该非常简单 - 但由于某种原因,“currentUserName”标记的内容在应用程序中出现 empty - 尽管它们在浏览器中生成的XML代码中表现得非常好

更奇怪的是,如果我在PHP文件(“makeXML.php”)中将硬编码值改为“uName” - 而不是从FORM中获取该值(使用$ _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的输出代码:(请注意,此代码全部出现在一行 - 它应该是怎么样的?不应该“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"; 

一切正常 ,我的UILabel中正确显示“John”这个名字......

1 个答案:

答案 0 :(得分:0)

正如psoft在他的评论中提到的那样,很难具体回答这样的问题,因为你的最终目标似乎有点不清楚。我将假设您刚开始尝试所有相关技术。

您的PHP脚本可以使用,我已在我的本地Apache服务器上测试过它。虽然有一些奇怪之处;例如将html <br/>插入XMLXML是一种数据格式(至少在此上下文中),并非真正用于演示。您的html文件也可以。

有三种非常明显的方法可以从你身边走过。

1)执行上述评论所说的内容。使用脚本写入数据库,然后使用另一个脚本访问它。第一个来自网页第二个来自objective-c代码。我很确定这不是你现在想要尝试的东西。

2)中断从您应用中的post发送UIWebView。通过其他方式将数据发送到服务器并解析结果。

3)忽略网络视图,直接将参数发送到服务器。

2&amp; 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;
    }
}

对于3,您只需自己创建NSURLRequest并根据需要进行配置。这需要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);