我在.vbs文件中创建 xml文件,其节点值如下所示,
<car>David's</car>
<company>Mannar & Co.</company>
解析这个xml时,我发现&amp;等等问题
我想用编码字符转换所有可能的 xml特殊字符(使用函数或其他东西),以便在解析时获得原始内容。
感谢你。
答案 0 :(得分:4)
这是一个老帖子,但我回复,因为我希望这会为某人带来一些悲伤
我正在研究一个供应商抱怨在某些情况下并非所有特殊字符都在XML中被转义的问题。我很惊讶地看到 dev使用它自己的逻辑(函数)而不是框架提供的一些功能,因为逃避听起来像一个非常常见的任务。以下是修复前的功能:
Function HTML_Encode(byVal string)
Dim tmp, i
tmp = string
For i = 160 to 255
tmp = Replace(tmp, chr(i), "&#" & i & ";")
Next
tmp = Replace(tmp, chr(34), """)
tmp = Replace(tmp, chr(39), "'")
tmp = Replace(tmp, chr(60), "<")
tmp = Replace(tmp, chr(62), ">")
tmp = Replace(tmp, chr(38), "&") <- the problem: this line should be the first replacement
tmp = Replace(tmp, chr(32), " ")
HTML_Encode = tmp
End Function
有趣的是,它看起来完全是这篇文章的答案之一(可能从这里复制:-)。
我将问题追溯到特殊字符被替换的顺序。替换&符号(&
)必须是第一个替换(行)替换(如:"
)正在注入符号,而&符号将被{{1}替换}。例如,如果我有以下字符串:&
。原始(上)函数将其转义为:We <3 SO
。正确的逃脱是:We &lt;3 SO
。
所以修改后的功能可以是:
We <3 SO
为完整起见,您可以在XML here
中找到预定义的实体答案 1 :(得分:0)
根据OP的评论在这里我自己制作版本,找不到可靠的版本,我认为它涵盖了所有可能的ascii字符
Function HTML_Encode(byVal string)
Dim tmp, i
tmp = string
For i = 160 to 255
tmp = Replace(tmp, chr(i), "&#" & i & ";")
Next
tmp = Replace(tmp, chr(34), """)
tmp = Replace(tmp, chr(39), "'")
tmp = Replace(tmp, chr(60), "<")
tmp = Replace(tmp, chr(62), ">")
tmp = Replace(tmp, chr(38), "&")
tmp = Replace(tmp, chr(32), " ")
HTML_Encode = tmp
End Function
Function HTML_Decode(byVal encodedstring)
Dim tmp, i
tmp = encodedstring
tmp = Replace(tmp, """, chr(34) )
tmp = Replace(tmp, "'", chr(39))
tmp = Replace(tmp, "<" , chr(60) )
tmp = Replace(tmp, ">" , chr(62) )
tmp = Replace(tmp, "&" , chr(38) )
tmp = Replace(tmp, " ", chr(32) )
For i = 160 to 255
tmp = Replace(tmp, "&#" & i & ";", chr(i))
Next
HTML_Decode = tmp
End Function
str = "This !@#± is a & test!"
wscript.echo HTML_Encode(str) '=> This !@#&#177; is a & test!
wscript.echo HTML_Decode(HTML_Encode(str)) '=> This !@#± is a & test!
答案 2 :(得分:0)
当我找到另一个时,我的钥匙还不冷,我把它作为另一个答案,因为输出是完全不同的,所以你可以选择最合适的。我确实删除了原来的答案,以免混淆
Function Escape(s)
Dim scr
Set scr = CreateObject("MSScriptControl.ScriptControl")
scr.Language = "VBScript"
scr.Reset
Escape = scr.Eval("escape(""" & s & """)")
End Function
Function Unescape(s)
Dim scr
Set scr = CreateObject("MSScriptControl.ScriptControl")
scr.Language = "VBScript"
scr.Reset
Unescape = scr.Eval("unescape(""" & s & """)")
End Function
wscript.echo Escape("This !@#± is a & test!") '=> This%20%21@%23%B1%20is%20a%20%26%20test%21
wscript.echo Unescape(Escape("This !@#± is a & test!")) '=> This !@#± is a & test!