changeset 5:7e9ce3e3d84a

modified win_rate.lua
author Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
date Sat, 28 Sep 2013 06:54:59 +0900
parents 06f22f0d9cab
children 18ba4378501e
files http/win_rate.lua http/xmlSimple.lua
diffstat 2 files changed, 195 insertions(+), 13 deletions(-) [+]
line wrap: on
line diff
--- a/http/win_rate.lua	Sat Sep 28 05:47:24 2013 +0900
+++ b/http/win_rate.lua	Sat Sep 28 06:54:59 2013 +0900
@@ -1,6 +1,6 @@
-package.path = '../?.lua;' .. package.path
+package.path = '../?.lua;./?.lua;' .. package.path
 
-local SLAXML = require("slaxdom")
+local xml = require("xmlSimple").newParser()
 local io = require("io")
 local http = require("socket.http")
 local ltn12 = require("ltn12")
@@ -11,19 +11,32 @@
 {
     url = url,
     method = "GET",
---    sink = ltn12.sink.file(io.stdout)
     sink = ltn12.sink.table(request)
 }
 
-local xml = table.concat(request)
-local doc = SLAXML:dom(xml)
-
-for i,v in pairs(doc) do print(i,v) end
-
-local kids = doc["kids"]
-print("kids:",kids)
-for i,v in pairs(kids) do 
-  print("kids:for")
-  print(i,v) 
+local xmlString = table.concat(request)
+local match = xmlString:gmatch('<table>(.-)</table>')
+local count = 0
+local userInfo = {}
+for i in match do 
+  local names = i:gmatch('<td style="color: #FFF;">(.-)</td>')
+  for j in names do
+    local href, name = j:match('<a href="(.-)">(.-)</a>')
+    if (href == nil) then 
+      userInfo[j] = {
+	name = j,
+	href = url
+      }
+    else 
+      userInfo[name] = {
+	name = name,
+	href = href
+      }
+    end
+  end
+  count = count + 1
+  if (count > 2) then break end
 end
 
+for i,v in pairs(userInfo) do print(i,v) end
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/http/xmlSimple.lua	Sat Sep 28 06:54:59 2013 +0900
@@ -0,0 +1,169 @@
+module(..., package.seeall)
+
+---------------------------------------------------------------------------------
+---------------------------------------------------------------------------------
+--
+-- xml.lua - XML parser for use with the Corona SDK.
+--
+-- version: 1.2
+--
+-- CHANGELOG:
+--
+-- 1.2 - Created new structure for returned table
+-- 1.1 - Fixed base directory issue with the loadFile() function.
+--
+-- NOTE: This is a modified version of Alexander Makeev's Lua-only XML parser
+-- found here: http://lua-users.org/wiki/LuaXml
+--
+---------------------------------------------------------------------------------
+---------------------------------------------------------------------------------
+function newParser()
+
+    XmlParser = {};
+
+    function XmlParser:ToXmlString(value)
+        value = string.gsub(value, "&", "&amp;"); -- '&' -> "&amp;"
+        value = string.gsub(value, "<", "&lt;"); -- '<' -> "&lt;"
+        value = string.gsub(value, ">", "&gt;"); -- '>' -> "&gt;"
+        value = string.gsub(value, "\"", "&quot;"); -- '"' -> "&quot;"
+        value = string.gsub(value, "([^%w%&%;%p%\t% ])",
+            function(c)
+                return string.format("&#x%X;", string.byte(c))
+            end);
+        return value;
+    end
+
+    function XmlParser:FromXmlString(value)
+        value = string.gsub(value, "&#x([%x]+)%;",
+            function(h)
+                return string.char(tonumber(h, 16))
+            end);
+        value = string.gsub(value, "&#([0-9]+)%;",
+            function(h)
+                return string.char(tonumber(h, 10))
+            end);
+        value = string.gsub(value, "&quot;", "\"");
+        value = string.gsub(value, "&apos;", "'");
+        value = string.gsub(value, "&gt;", ">");
+        value = string.gsub(value, "&lt;", "<");
+        value = string.gsub(value, "&amp;", "&");
+        return value;
+    end
+
+    function XmlParser:ParseArgs(node, s)
+        string.gsub(s, "(%w+)=([\"'])(.-)%2", function(w, _, a)
+            node:addProperty(w, self:FromXmlString(a))
+        end)
+    end
+
+    function XmlParser:ParseXmlText(xmlText)
+        local stack = {}
+        local top = newNode()
+        table.insert(stack, top)
+        local ni, c, label, xarg, empty
+        local i, j = 1, 1
+        while true do
+            ni, j, c, label, xarg, empty = string.find(xmlText, "<(%/?)([%w_:]+)(.-)(%/?)>", i)
+            if not ni then break end
+            local text = string.sub(xmlText, i, ni - 1);
+            if not string.find(text, "^%s*$") then
+                local lVal = (top:value() or "") .. self:FromXmlString(text)
+                stack[#stack]:setValue(lVal)
+            end
+            if empty == "/" then -- empty element tag
+                local lNode = newNode(label)
+                self:ParseArgs(lNode, xarg)
+                top:addChild(lNode)
+            elseif c == "" then -- start tag
+                local lNode = newNode(label)
+                self:ParseArgs(lNode, xarg)
+                table.insert(stack, lNode)
+		top = lNode
+            else -- end tag
+                local toclose = table.remove(stack) -- remove top
+
+                top = stack[#stack]
+                if #stack < 1 then
+                    error("XmlParser: nothing to close with " .. label)
+                end
+                if toclose:name() ~= label then
+                    error("XmlParser: trying to close " .. toclose.name .. " with " .. label)
+                end
+                top:addChild(toclose)
+            end
+            i = j + 1
+        end
+        local text = string.sub(xmlText, i);
+        if #stack > 1 then
+            error("XmlParser: unclosed " .. stack[#stack]:name())
+        end
+        return top
+    end
+
+    function XmlParser:loadFile(xmlFilename, base)
+        if not base then
+            base = system.ResourceDirectory
+        end
+
+        local path = system.pathForFile(xmlFilename, base)
+        local hFile, err = io.open(path, "r");
+
+        if hFile and not err then
+            local xmlText = hFile:read("*a"); -- read file content
+            io.close(hFile);
+            return self:ParseXmlText(xmlText), nil;
+        else
+            print(err)
+            return nil
+        end
+    end
+
+    return XmlParser
+end
+
+function newNode(name)
+    local node = {}
+    node.___value = nil
+    node.___name = name
+    node.___children = {}
+    node.___props = {}
+
+    function node:value() return self.___value end
+    function node:setValue(val) self.___value = val end
+    function node:name() return self.___name end
+    function node:setName(name) self.___name = name end
+    function node:children() return self.___children end
+    function node:numChildren() return #self.___children end
+    function node:addChild(child)
+        if self[child:name()] ~= nil then
+            if type(self[child:name()].name) == "function" then
+                local tempTable = {}
+                table.insert(tempTable, self[child:name()])
+                self[child:name()] = tempTable
+            end
+            table.insert(self[child:name()], child)
+        else
+            self[child:name()] = child
+        end
+        table.insert(self.___children, child)
+    end
+
+    function node:properties() return self.___props end
+    function node:numProperties() return #self.___props end
+    function node:addProperty(name, value)
+        local lName = "@" .. name
+        if self[lName] ~= nil then
+            if type(self[lName]) == "string" then
+                local tempTable = {}
+                table.insert(tempTable, self[lName])
+                self[lName] = tempTable
+            end
+            table.insert(self[lName], value)
+        else
+            self[lName] = value
+        end
+        table.insert(self.___props, { name = name, value = self[name] })
+    end
+
+    return node
+end