商城首页欢迎来到中国正版软件门户

您的位置: 首页 > 文章列表 > 编程开发 > 报错:XML页无法显示,下列标记没有被关闭解决方法

报错:XML页无法显示,下列标记没有被关闭解决方法

  发布于2026-07-22 阅读(0)

扫一扫,手机访问

在生成XML数据时,有时会遇到一个挺让人头疼的问题:明明代码里已经用把标签关得严严实实,可浏览器或解析器偏偏提示“hd、category、subsort没有关闭”。这到底是怎么回事?

先说结论:问题出在数据本身,而不是标签结构。你想啊,如果数据库里存的内容包含<>&"'这些特殊字符,直接输出到XML里,就会跟真正的标签“撞车”,导致解析器误以为标签没闭合。所以,关键一步是对数据做XML编码(也就是转义)。

下面这段ASP代码示范了基本的XML输出结构,注意标签的嵌套顺序是正确的:

<%
response.ContentType = "text/xml"
Response.CharSet = "GB2312"
Response.Expires = 0
Response.write ""
Response.write vbcrlf & ""
Response.write vbcrlf & vbTab & ""
Response.write vbcrlf & vbTab & vbTab & ""
' 连接数据库的语句省略
do while not rs.eof
    response.write vbcrlf & vbTab & vbTab & vbTab & ""
    response.write vbcrlf & vbTab & vbTab & vbTab & vbTab & "" & rs("id") & ""
    response.write vbcrlf & vbTab & vbTab & vbTab & ""
loop
rs.close()
set rs = nothing
response.write vbcrlf & vbTab & vbTab & ""
response.write vbcrlf & vbTab & ""
response.write vbcrlf & ""
Response.End()
%>

代码写得没问题,但如果rs("id")里含有<之类的字符,就会出乱子。这时就需要一个专门的编码函数。下面这个XMLEncode函数可以处理:

Function XMLEncode(var)
    On Error Resume Next
    Dim strTmp
    If (IsNull(var)) Then
        var = ""
    End If
    If (VarType(var) = 11) Then
        If (var) Then
            strTmp = "1"
        Else
            strTmp = "0"
        End If
    Else
        strTmp = CStr(var)
        strTmp = Replace(strTmp, "&", "&")
        strTmp = Replace(strTmp, "<", "<")
        strTmp = Replace(strTmp, ">", ">")
        strTmp = Replace(strTmp, """", """)
        strTmp = Replace(strTmp, "'", "'")
    End If
    XMLEncode = strTmp
End Function

Function XMLDecode(str)
    Dim temp
    temp = replace(str, "&", "&")
    temp = replace(temp, "<", "<")
    temp = replace(temp, ">", ">")
    temp = replace(temp, """, """")
    temp = replace(temp, "'", "'")
    XMLDecode = temp
End Function

使用时,只需把rs("字段名字")包在XMLEncode()里再输出,比如:

response.write XMLEncode(rs("字段名字"))

除了数据转义,还有两个容易踩的坑值得注意:

第一,编码声明要匹配。 如果XML文件头声明的是UTF-8,但实际文件保存的是GB2312(或者反过来),解析器也会报错。最简单的做法是统一用GB2312,把声明改成:

Response.write ""

第二,输出前先清空缓冲区。 如果之前有别的输出(比如HTML、空白字符),可能会干扰XML结构。建议在输出XML头之前加上Response.Clear

Response.Clear
Response.write ""

另外,写代码时用vbCrlf & vbTab & vbTab & “这种拼接方式,生成出来的XML可读性会好很多,调试时也更容易一眼看出标签是否闭合。

总结一下:标签没闭合的提示,十有八九是数据里藏了特殊字符。做好转义、统一编码、清空输出,这三大招基本能搞定绝大多数问题。如果还是报错,不妨先输出原始XML文本(用浏览器查看源代码),看看是不是某个字段的值直接裸露了尖括号——那才是真正的“元凶”。

本文转载于:https://www.jb51.net/article/32554.htm 如有侵犯,请联系zhengruancom@outlook.com删除。
免责声明:正软商城发布此文仅为传递信息,不代表正软商城认同其观点或证实其描述。

热门关注