很难解析使用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”这个名字......
答案 0 :(得分:0)
正如psoft
在他的评论中提到的那样,很难具体回答这样的问题,因为你的最终目标似乎有点不清楚。我将假设您刚开始尝试所有相关技术。
您的PHP
脚本可以使用,我已在我的本地Apache服务器上测试过它。虽然有一些奇怪之处;例如将html
<br/>
插入XML
。 XML
是一种数据格式(至少在此上下文中),并非真正用于演示。您的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);