我有一个使用xmerl解析来自外部用户的XML内容的应用程序。这意味着,任何字符串都可以来自它们。
我使用xmerl_scan:string / 1来解析这个xml,但是当xml在文本中包含一些'\'时,我开始遇到一些错误。
例如:
XML = "<tag>say.com\brothers</tag>",
xmerl_scan:string(XML).
导致:
3266- fatal: {error,{wfc_Legal_Character,8}}
** exception exit: {fatal,{{error,{wfc_Legal_Character,8}},
{file,file_name_unknown},
{line,1},
{col,15}}}
in function xmerl_scan:fatal/2
in call from xmerl_scan:scan_char_data/5
in call from xmerl_scan:scan_content/11
in call from xmerl_scan:scan_element/12
in call from xmerl_scan:scan_document/2
in call from xmerl_scan:string/2
我的问题是:有没有人有同样的问题?我该如何解决这个问题?
我知道,当我有这个时,这也会引起某种例外:
\ b 。\ E \F 符\ v \X \ 0 .. \ 7
在我的字符串中。
由于
答案 0 :(得分:3)
在上面的例子中,这违反了格式良好的XML规范:
http://www.w3.org/TR/REC-xml/#NT-Char
Char ::= #x9 | #xA | #xD | [#x20-#xD7FF] | [#xE000-#xFFFD] | [#x10000-#x10FFFF]
/* any Unicode character, excluding the surrogate blocks, FFFE, and FFFF. */
在Erlang中,反斜杠字符用于转义序列。 “\ b”是字符8(退格字符)的转义序列,因此代替"say.com\brothers"
意味着:"say.com"
(退格)"rothers"
。
问题是字符8不在允许列表中,因此需要进行转义... XML转义,而不是Erlang转义...以使XML有效。
当字符串来自外部用户时,这不会有问题。反斜杠转义仅用于将Erlang源中的文字转换为内存中的字符串的过程。如果您读入包含反斜杠的外部字符串,则应该看到它在打印时显示为double:"\\"
是文字反斜杠的转义序列。因此,"<tag>say.com\brothers</tag>"
将显示为"<tag>say.com\\brothers</tag>"
。
如果你逃避反斜杠,它可以正常工作。
> xmerl_scan:string("<tag>say.com\\brothers</tag>").
{{xmlElement,tag,tag,[],
{xmlNamespace,[],[]},
[],1,[],
[{xmlText,[{tag,1}],1,[],"say.com\\brothers",text}],
[],"/root",undeclared},
[]}
这似乎只是您测试方式的问题,不应该是外部数据的问题。但是,如果用户 传递无效的XML,则会导致您发现异常。要处理这种情况,您需要通过捕获退出或使用catch
来明确检查它。