发布于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文本(用浏览器查看源代码),看看是不是某个字段的值直接裸露了尖括号——那才是真正的“元凶”。
上一篇:不同浏览器对XML的解析是不同的
下一篇:关联数据入门——RDF应用
售后无忧
立即购买>office旗舰店
售后无忧
立即购买>office旗舰店
售后无忧
立即购买>office旗舰店
售后无忧
立即购买>office旗舰店
正版软件
正版软件
正版软件
正版软件
正版软件
1
2
3
7
8