当前位置:编程学习 > XML/UML >>

Wax框架简明教程(4)Wax HTTP+XML示例

本来是想介绍“Building NativeiOS Apps with Wax: Creating a Sample Application”一文的第二部分,它介绍了一个从iOS获取twitter主题的Wax Application实现过程。其中,twitter的数据是用JSON封装的 。

但很不幸,由于众所周知的原因,国内的用户无法直接访问twitter的服务器 。 因此我修改了这个例子,改为用HTTP+XML的,服务器端用java实现,在调试时你可以把服务端放在本地,这样就不受网络限制。同时,服务器数据改用XML封装。因为在我的经验中,XML使用的概率远大于JSON。

但问题在于,wax_http中没有针对XML格式数据进行实现。你可以查看它的源代码,它只实现了:text、json、binary三种format。如果你使用json,那么在wax_http中根本不需要涉及json解析,正如“Building NativeiOS Apps with Wax: Creating a Sample Application”的例子所示,一切都是透明的。

因此我们就只能自己进行XML解析。本文采用的是“Luaonly XML parser”方式。这种实现最早源自AlexanderMakeeve,后面又衍生出了许多版本。

我们在github上找到了其中一个版本,是CoronaXML Module的修改版本,叫做:LuaSimple XML Parser。

这个XML parser只有一个易做图Xml.lua文件,使用起来很方便——将它拷贝到你的工程目录中就可以使用了。

 

一、服务端

 

作为示例,服务端的代码足够简单,它就是directory.jsp:

<%// 重要,否则出现乱码%>

<%@ page contentType="text/html; charset=utf-8" language="java" errorPage=""%>

<%

Stringuser=request.getParameter("user");

Stringpass=request.getParameter("pass");

out.println("<?xmlversion=\"1.0\" encoding=\"utf-8\" ?>");

if(user!=null || pass!=null){

Stringxml="<list><deptname='行政部' id='01'><linkman id='001'name='郭书全'/>"+

"<linkman id='003' name='雅各布'/>"+

"</dept>"+"<dept name='人力部' id='02'><linkman id='002' name='王有福'>"+

"</linkman></dept></list>";

System.out.println(xml);

// response.setCharacterEncoding("utf-8");

out.println(xml);

}else{

out.println("<login><status>false</status></login>");

}

%>

代码基本上是静态的,你把它的HTML代码保存为.htm文件也不会有什么问题。

 

二、Wax实现

新建Single ViewApplication工程。加入Wax框架。关于Wax框架的安装,你可以参考“XCode 4.2下Wax的安装步骤”一文。

接下来我们准备实现一个WaxApplication。首先是main.m文件:

#import <UIKit/UIKit.h>

#import "wax.h"

#import "wax_http.h"

#import "wax_xml.h"

#import "wax_filesystem.h"

intmain(int argc, char *argv[]) {

    NSAutoreleasePool * pool =[[NSAutoreleasePoolalloc] init];

   

    wax_start("AppDelegate.lua", luaopen_wax_http, luaopen_wax_xml, luaopen_wax_filesystem, nil);

   

    int retVal = UIApplicationMain(argc, argv, nil, @"AppDelegate");

    [pool release];

    return retVal;

}

 

注意代码中的“wax_xml.h”和“luaopen_wax_xml”。原来是“wax_json.h”和“luaopen_wax_json”。我们原来是想用wax.xml代替wax.json来着,但由于wax虽然实现了wax.xml,但在wax_http中根本没有使用,实际上“wax_xml.h”和“luaopen_wax_xml”在这里没有任何意义。

 

然后是AppDelegate.lua:

 

require "MyTableViewController"

 

waxClass{"AppDelegate", protocols = {"UIApplicationDelegate"}}

 

function applicationDidFinishLaunching(self, application)

    local frame = UIScreen:mainScreen():bounds()

    self.window =UIWindow:initWithFrame(frame)

    

   self.controller = MyTableViewController:init()

local nc=UINavigationController:initWithRootViewController(self.controller)

    self.window:setRootViewController(nc)

    

   self.window:makeKeyAndVisible()

end

应用程序启动时没有直接加载MyTableViewController,而是用一个NavigationController来加载MyTableViewController。这样可以为我们提供一个额外的NavigationBar。

 

最后是MyTableViewController.lua的实现:

 

require("xmlSimple")

 

waxClass{"MyTableViewController", UITableViewController}

 

function init(self)

    self.super:initWithStyle(UITableViewStyleGrouped)

    self.trends ={}

 

    return self

end

 

function viewDidLoad(self)

   self:setTitle("Wax Http+XML示例")

    self:tableView():setAllowsSelection(false)

    local button =UIBarButtonItem:initWithBarButtonSystemItem_target_action(UIBarButtonSystemItemRefresh,self, "loadDataFromTwitter")

    self:navigationItem():setRightBarButtonItem(button)

end

 

functionloadDataFromTwitter(self)

   UIApplication:sharedApplication():setNetworkActivityIndicatorVisible(true)-- show spinner

    wax.http.request{"http://localhost:8080/AnyMail/directory.jsp?user=1&pass=1",callback = function(body, response)

       UIApplication:sharedApplication():setNetworkActivityIndicatorVisible(false)-- hide spinner

       local xml = xmlSimple:newParser()

       local parseXml=xml:ParseXmlText(body)

        if response:statusCode() == 200 then

            self.trends = {} -- Reset the list oftrends when the trends are refreshed

           --[[]]

            for index,value in ipairs(parseXml.list.dept) do -- iterateover a table with numerical keys

                table.insert(self.trends, "+"..value["@name"]) -- append the value to the "array"

              

               linkman=value.linkman

               puts(#linkman)

               if linkman~=nil then

                  

                   if #linkman>0 then

                       for i,v in ipairs(linkman) do

                           table.insert(self.trends,"    -"..v["@name"])

                       end

 

补充:移动开发 , IOS ,
CopyRight © 2022 站长资源库 编程知识问答 zzzyk.com All Rights Reserved
部分文章来自网络,