0

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

这是场景:

1) 用户来到一个网页,在一个文本字段中输入他们的名字,然后点击提交

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

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

应该很简单——但由于某种原因,“currentUserName”标签的内容在应用程序中是的——尽管它们在浏览器中生成的 XML 代码中显示得非常好。

更奇怪的是,如果我在 PHP 文件(“makeXML.php”)中将值硬编码为“uName”,而不是从 FORM 中获取该值(使用 $_POST[“userName”];) - 这一切都运作良好。我能够从“currentUserName”标签中获取值并将其输出到 UILabel 对象。

由于某种原因,NSXMLParser 似乎只是不喜欢 POST 的值。

有任何想法吗?

这是代码:

门户网站.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 中......

4

1 回答 1

0

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

您的PHP脚本可以运行,我已经在本地 Apache 服务器上对其进行了测试。虽然有一些奇怪的地方;比如插入一个html <br/>into XMLXML是一种数据格式(至少在这种情况下),并非真正用于演示。您的html文件也可以正常工作。

从您所在的位置出发,有三种非常明显的方式。

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

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

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

2和3都非常相关。主要区别在于NSURLRequest.

对于 2,获取 post 请求非常容易。首先,您将设置一些对象,比如说您的视图控制器,作为 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);
于 2012-04-15T16:58:18.413 回答