-- 获取源文件信息
|
local handle = io.popen("cd")
|
local script_dir
|
if handle then
|
script_dir = handle:read("*a"):gsub("[\r\n]+$", "")
|
handle:close()
|
end
|
print(jit and jit.arch or "unknown")
|
-- 设置脚本目录
|
-- package.path = package.path .. ";./bin/;./jx/?.lua;./jx_base/?.lua;./mobox_base/?.lua;./wms/?.lua;./wms_base/?.lua;"
|
-- 动态获取当前脚本目录(关键!)
|
-- local script_dir = debug.getinfo(1, "S").source:match("@?(.*/)")
|
print("当前脚本所在的目录是: " .. script_dir)
|
|
-- 重置 package.path(避免旧路径干扰)
|
package.path = ""
|
package.path = package.path .. ";" .. script_dir .. "./?.lua"
|
-- 添加必要路径(使用正确的模板格式)
|
package.path = package.path .. ";" .. script_dir .. "/bin/?.lua" .. -- 子目录 bin
|
";" .. script_dir .. "/lualibs/?.lua" .. -- 子目录 bin
|
";" .. script_dir .. "/jx/?.lua" .. -- 子目录 jx
|
";" .. script_dir .. "/jx_base/?.lua" .. ";" .. script_dir .. "/wms/?.lua" .. ";" .. script_dir ..
|
"/lualibs/xml2lua-master/?.lua" .. ";" .. script_dir .. "/wms_base/?.lua" .. ";" .. script_dir ..
|
"/mobox_base/?.lua"
|
|
-- 添加 C 模块搜索路径(针对 Windows 的 .dll 文件)
|
package.cpath = package.cpath .. ";" .. script_dir .. "/bin/clibs/?.dll" .. ";" .. script_dir .. "/bin/socket/?.dll" ..
|
";" .. script_dir .. "/bin/clibs/socket/?.dll"
|
|
local xml2lua = require("xml2lua")
|
-- Uses a handler that converts the XML to a Lua table
|
local handler = require("xmlhandler.tree")
|
local cjson = require("json")
|
|
-- SOAP XML 数据
|
local soap_xml = [[
|
<?xml version="1.0" encoding="utf-8"?>
|
<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
|
<soap:Body>
|
<v1:InCompanyReq xmlns:v1="http://www.gkht.com/Information/INV/Ebs/Schemas/InCompany/V1.0">
|
<v1:Company_Input>
|
<v1:RESTHeader>
|
<v1:NLSLanguage>SIMPLIFIED CHINESE</v1:NLSLanguage>
|
<v1:Org_Id>0</v1:Org_Id>
|
</v1:RESTHeader>
|
<v1:InputParameters>
|
<v1:COMPANY_TB>
|
<v1:COMPANY_TB_ITEM>
|
<v1:companyCode>CBJJT1</v1:companyCode>
|
<v1:companyName>北京京泰日晟科技有限公司</v1:companyName>
|
<v1:memo>个</v1:memo>
|
</v1:COMPANY_TB_ITEM>
|
<v1:COMPANY_TB_ITEM>
|
<v1:companyCode>CBJJXK</v1:companyCode>
|
<v1:companyName>北京吉鑫康商贸有限公司</v1:companyName>
|
<v1:memo>个</v1:memo>
|
</v1:COMPANY_TB_ITEM>
|
</v1:COMPANY_TB>
|
</v1:InputParameters>
|
</v1:Company_Input>
|
</v1:InCompanyReq>
|
</soap:Body>
|
</soap:Envelope>
|
]]
|
soap_xml = [[
|
<soapenv:Envelope
|
xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/">
|
<soap:Header
|
xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
|
</soap:Header>
|
<soapenv:Body>
|
<v1:inCommodityReq
|
xmlns:v1="http://www.gkht.com/Information/INV/Ebs/Schemas/InCommodity/V1.0">
|
<v1:COMMODITY_Input>
|
<v1:RESTHeader>
|
<v1:Responsibility/>
|
<v1:RespApplication/>
|
<v1:SecurityGroup/>
|
<v1:NLSLanguage>SIMPLIFIED CHINESE</v1:NLSLanguage>
|
<v1:Org_Id>0</v1:Org_Id>
|
</v1:RESTHeader>
|
<v1:InputParameters>
|
<v1:COMMODITY_TB>
|
<!--1 or more repetitions:-->
|
<v1:COMMODITY_TB_ITEM>
|
<v1:skuId>KH32803017</v1:skuId>
|
<v1:storerId>CGKHTY</v1:storerId>
|
<v1:skuName>螺旋刀片式髓内钉</v1:skuName>
|
<v1:skuDec>螺旋刀片式股骨近端髓内钉10×170</v1:skuDec>
|
<v1:spec>JGDⅥ φ10×170</v1:spec>
|
<v1:packageCode>个</v1:packageCode>
|
<v1:packageQty>1</v1:packageQty>
|
<v1:goodsUnit>件</v1:goodsUnit>
|
<v1:length>1</v1:length>
|
<v1:width>2</v1:width>
|
<v1:height>3</v1:height>
|
<v1:abcType></v1:abcType>
|
<v1:isBatchMgr>1</v1:isBatchMgr>
|
<v1:isSnMgr>1</v1:isSnMgr>
|
<v1:isSnStorageMgr>0</v1:isSnStorageMgr>
|
<v1:imgUrl></v1:imgUrl>
|
<v1:cidtype>A</v1:cidtype>
|
<v1:productLine>KH-创伤</v1:productLine>
|
<v1:storageConditions>常温</v1:storageConditions>
|
<v1:skuType>small</v1:skuType>
|
<v1:maxCount>50</v1:maxCount>
|
<v1:sptm></v1:sptm>
|
<v1:barcode1></v1:barcode1>
|
<v1:barcode2></v1:barcode2>
|
<v1:barcode3></v1:barcode3>
|
<v1:barcode_pk></v1:barcode_pk>
|
</v1:COMMODITY_TB_ITEM>
|
</v1:COMMODITY_TB>
|
</v1:InputParameters>
|
</v1:COMMODITY_Input>
|
</v1:inCommodityReq>
|
</soapenv:Body>
|
</soapenv:Envelope>
|
]]
|
-- 解析配置
|
local parser = xml2lua.parser(handler)
|
-- parser:parse(soap_xml) -- 注意冒号调用[7](@ref)
|
|
-- 数据清洗函数(处理命名空间和空值)
|
local function clean_data(data)
|
local function process(tbl)
|
local result = {}
|
for k, v in pairs(tbl) do
|
-- 去除命名空间前缀[6,9](@ref)
|
local new_key = k:gsub("v1:", ""):gsub("soap:", "")
|
|
if type(v) == "table" then
|
-- 处理数组结构[4](@ref)
|
if #v > 0 then
|
local arr = {}
|
for i, item in ipairs(v) do
|
arr[i] = process(item)
|
end
|
result[new_key] = arr
|
else
|
result[new_key] = process(v)
|
end
|
else
|
result[new_key] = v ~= "" and v or nil
|
end
|
end
|
return result
|
end
|
return process(handler.root)
|
end
|
|
-- 生成 JSON
|
-- local cleaned = clean_data(handler.root)
|
-- local json_str = cjson.encode(cleaned) -- 使用 cjson 序列化[3,4](@ref)
|
|
print(json_str)
|
-- 安全解析函数
|
local function safe_parse(xml_str)
|
local ok, err = pcall(function()
|
parser:parse(xml_str) -- 使用 pcall 捕获异常[7](@ref)
|
end)
|
if not ok then
|
print("XML解析失败:", err)
|
return nil
|
end
|
return handler.root
|
end
|
local cleaned = nil;
|
-- 执行解析
|
local parsed_data = safe_parse(soap_xml)
|
if parsed_data then
|
cleaned = clean_data(parsed_data)
|
print(cjson.encode(cleaned))
|
end
|
|
-- 查找 Req 元素(body 下的第一个元素)
|
-- 获取 soapenv:Body 下的所有键
|
local body_keys = {}
|
local body = cleaned["soapenv:Envelope"]["soapenv:Body"]
|
for k, _ in pairs(body) do
|
table.insert(body_keys, k)
|
end
|
|
-- 使用数字索引 1 获取 Req 元素(Lua 索引从 1 开始)
|
local req_key = body_keys[1]
|
local req = body[req_key]
|
|
-- 获取 Req 下的所有键
|
local req_keys = {}
|
for k, _ in pairs(req) do
|
table.insert(req_keys, k)
|
end
|
|
-- 使用数字索引 2 获取 Input 元素
|
local input_key = req_keys[2]
|
local input = req[input_key]
|
|
-- 提取 InputParameters 数据
|
local input_parameters = input["InputParameters"]
|
|
-- 打印 InputParameters 数据
|
local function print_table(t, indent)
|
indent = indent or 0
|
for k, v in pairs(t) do
|
local prefix = string.rep(" ", indent)
|
if type(v) == "table" then
|
print(prefix .. tostring(k) .. ":")
|
print_table(v, indent + 1)
|
else
|
print(prefix .. tostring(k) .. ": " .. tostring(v))
|
end
|
end
|
end
|
|
print_table(input_parameters)
|