read_xml.lua


NAME
    read_xml

FUNCTION
    read_xml(fname)

NOTES
    Reads data from a XML file.
    The file must have a data section as follows
    < data nrow="2" ncol="3" >
        11.9    22.5    33.9876
        10.3     3.1    20.6633
    < /data >

INPUTS
    fname - file name

OUTPUTS
    a zeArray object

SOURCE

require("register")

function read_xml(fname)
    local ivec = 0
    local tag = nil
    local nele = 0
    local nvec = 0
    local flag = false
    local arr = nil
    local xml = zeAux.new("xml")
    xml:callback("f1", "f2", "f3")
    
    f1 = function(n, s, t)      -- tart tag
        tag = s
        if (t) then
            for k, v in t do
                if (k == "nrow") then nele = tonumber(v); end
                if (k == "ncol") then nvec = tonumber(v); end
            end
        end
        if (s == "data" and nele > 0 and nvec > 0) then
            arr = zeUtl.new("double")
            arr:resize(nele, nvec)
            nele = 0;
            nvec = 0;
            flag = true
        end
    end

    f2 = function(n, s)         -- end tag
        tag = nil
    end

    f3 = function(n, s, l)                              -- xml data
        if (not xml.isblank(s) and flag == true) then
            if (tag == "data" ) then
                arr:parse(ivec, s)
                ivec = ivec + 1
            end
        end
    end
    
    for line in io.lines(fname) do
        xml:parse(line)
    end
    
    return arr
end