如何在lua中使用字符串查找提取xml元素值

我需要使用lua从soap包含的soap头中提取用户名和密码元素值。

示例请求-

...
<soap:Header><wsse:Security xmlns:wsse=“http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd” soapenv:mustUnderstand=“1”>
<wsse:UsernameToken><wsse:Username>testuser</wsse:Username>
<wsse:Password wsse:Type=“http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-username-token-profile-1.0#PasswordText”>testpassword</wsse:Password>
</wsse:UsernameToken></wsse:Security></soap:Header>
...

使用以下方法不能给出正确的结果(不能使用xml解析器),是否有更好的匹配方式?

local username = string.match(soapload, "^.+Username>(.+)</wsse:Username>.+$")
local password = string.match(soapload, "^.+PasswordText\">(.+)</wsse:Password>.+$")
点赞
用户7504558
用户7504558

你的示例使用的是“右双引号”(PasswordText”>)的编码\\u201D,所以你什么也没有得到。但是它们不需要被转义,这是不必要的。

local soapload = [[
<soap:Header><wsse:Security xmlns:wsse="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd" soapenv:mustUnderstand="1">
<wsse:UsernameToken><wsse:Username>testuser</wsse:Username>
<wsse:Password wsse:Type="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-username-token-profile-1.0#PasswordText">testpassword</wsse:Password>
</wsse:UsernameToken></wsse:Security></soap:Header>
]]

local username = string.match(soapload, "<wsse:Username>(.-)</wsse:Username>")
local password = string.match(soapload, "<wsse:Password.-PasswordText\">(.-)</wsse:Password>")

print(username)
print(password)
2020-02-25 11:18:27