fix: xml parser (#2140)
This commit is contained in:
@@ -57,7 +57,7 @@ local function parseAttributes(attrStr)
|
||||
if not attrStr or attrStr == "" then return attrs end
|
||||
|
||||
-- 匹配属性模式:name="value" 或 name='value'
|
||||
for name, value in attrStr:gmatch("([-_%w]+)%s*=%s*[\"']([^\"']*)[\"']") do
|
||||
for name, value in attrStr:gmatch("([_%w]+)%s*=%s*[\"']([^\"']*)[\"']") do
|
||||
attrs[name] = value
|
||||
end
|
||||
return attrs
|
||||
@@ -97,11 +97,11 @@ local function isValidXmlTag(tag, xmlContent, tagStart)
|
||||
if not tag:match("^<[^<>]*>$") then return false end
|
||||
|
||||
-- 检查是否是合法的标签格式
|
||||
if tag:match("^</[-_%w]+>$") then return true end -- 结束标签
|
||||
if tag:match("^<[-_%w]+[^>]*/>$") then return true end -- 自闭合标签
|
||||
if tag:match("^<[-_%w]+[^>]*>$") then
|
||||
if tag:match("^</[_%w]+>$") then return true end -- 结束标签
|
||||
if tag:match("^<[_%w]+[^>]*/>$") then return true end -- 自闭合标签
|
||||
if tag:match("^<[_%w]+[^>]*>$") then
|
||||
-- 对于开始标签,进行额外的上下文检查
|
||||
local tagName = tag:match("^<([-_%w]+)")
|
||||
local tagName = tag:match("^<([_%w]+)")
|
||||
|
||||
-- 检查是否存在对应的结束标签
|
||||
local closingTag = "</" .. tagName .. ">"
|
||||
@@ -152,17 +152,17 @@ function StreamParser:parseBuffer()
|
||||
local remaining = self.buffer:sub(self.position)
|
||||
|
||||
-- 查找下一个标签
|
||||
local tagStart, tagEnd = remaining:find("<[^>]*>")
|
||||
local tagStart, tagEnd = remaining:find("</?[%w_]+>")
|
||||
|
||||
if not tagStart then
|
||||
-- 检查是否有未完成的开始标签(以<开始但没有>结束)
|
||||
local incompleteStart = remaining:find("<[^>]*$")
|
||||
local incompleteStart = remaining:find("<[%w_]+$")
|
||||
if incompleteStart then
|
||||
local incompleteContent = remaining:sub(incompleteStart)
|
||||
-- 确保这确实是一个未完成的标签,而不是文本中的<符号
|
||||
if incompleteContent:match("^<[%w_-]") then
|
||||
if incompleteContent:match("^<[%w_]") then
|
||||
-- 尝试解析未完成的开始标签
|
||||
local tagName = incompleteContent:match("^<([%w_-]+)")
|
||||
local tagName = incompleteContent:match("^<([%w_]+)")
|
||||
if tagName then
|
||||
-- 处理未完成标签前的文本
|
||||
if incompleteStart > 1 then
|
||||
@@ -347,8 +347,8 @@ function StreamParser:parseBuffer()
|
||||
local currentDepth = #self.stack
|
||||
if currentDepth >= 1 then
|
||||
-- 检查是否是当前元素的结束标签
|
||||
if tag:match("^</[-_%w]+>$") and self.current then
|
||||
local tagName = tag:match("^</([-_%w]+)>$")
|
||||
if tag:match("^</[_%w]+>$") and self.current then
|
||||
local tagName = tag:match("^</([_%w]+)>$")
|
||||
if self.current._name == tagName then
|
||||
-- 这是当前元素的结束标签,正常处理
|
||||
if not self:processTag(tag) then
|
||||
@@ -396,9 +396,9 @@ end
|
||||
|
||||
-- 处理单个标签
|
||||
function StreamParser:processTag(tag)
|
||||
if tag:match("^</[-_%w]+>$") then
|
||||
if tag:match("^</[_%w]+>$") then
|
||||
-- 结束标签
|
||||
local tagName = tag:match("^</([-_%w]+)>$")
|
||||
local tagName = tag:match("^</([_%w]+)>$")
|
||||
if self.current and self.current._name == tagName then
|
||||
-- 标记当前元素为完成状态
|
||||
self.current._state = "complete"
|
||||
@@ -412,9 +412,9 @@ function StreamParser:processTag(tag)
|
||||
self.last_error = "Mismatched closing tag: " .. tagName
|
||||
return false
|
||||
end
|
||||
elseif tag:match("^<[-_%w]+[^>]*/>$") then
|
||||
elseif tag:match("^<[_%w]+[^>]*/>$") then
|
||||
-- 自闭合标签
|
||||
local tagName, attrs = tag:match("^<([-_%w]+)([^>]*)/>")
|
||||
local tagName, attrs = tag:match("^<([_%w]+)([^>]*)/>")
|
||||
local element = {
|
||||
_name = tagName,
|
||||
_attr = parseAttributes(attrs),
|
||||
@@ -429,9 +429,9 @@ function StreamParser:processTag(tag)
|
||||
if not self.current.children then self.current.children = {} end
|
||||
table.insert(self.current.children, element)
|
||||
end
|
||||
elseif tag:match("^<[-_%w]+[^>]*>$") then
|
||||
elseif tag:match("^<[_%w]+[^>]*>$") then
|
||||
-- 开始标签
|
||||
local tagName, attrs = tag:match("^<([-_%w]+)([^>]*)>")
|
||||
local tagName, attrs = tag:match("^<([_%w]+)([^>]*)>")
|
||||
local element = {
|
||||
_name = tagName,
|
||||
_attr = parseAttributes(attrs),
|
||||
|
||||
Reference in New Issue
Block a user