xmerl无法识别几个字符

时间:2012-02-02 21:07:45

标签: xml erlang

我有一个使用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

在我的字符串中。

由于

1 个答案:

答案 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来明确检查它。