Xml xmerl无法识别几个字符

Xml xmerl无法识别几个字符,xml,erlang,Xml,Erlang,我有一个应用程序,它使用xmerl解析来自外部用户的XML内容。这意味着,任何字符串都可以来自它们 我使用xmerl\u scan:string/1解析这个xml,但是当xml在文本中包含一些“\”时,我开始出现一些错误 例如: XML = "<tag>say.com\brothers</tag>", xmerl_scan:string(XML). 我的问题是:有人已经有同样的问题了吗?我怎样才能解决这个问题 我知道这也会引起一些例外情况,当我: \b \e \f \五

我有一个应用程序,它使用xmerl解析来自外部用户的XML内容。这意味着,任何字符串都可以来自它们

我使用xmerl\u scan:string/1解析这个xml,但是当xml在文本中包含一些“\”时,我开始出现一些错误

例如:

XML = "<tag>say.com\brothers</tag>",
xmerl_scan:string(XML).
我的问题是:有人已经有同样的问题了吗?我怎样才能解决这个问题

我知道这也会引起一些例外情况,当我:

\b \e \f \五 \x \0 .. \七,

在我的范围内


感谢您在上面的示例中,这违反了格式良好的XML规范:

在Erlang中,反斜杠字符用于转义序列。“\b”是字符8(退格字符)的转义序列,因此它的意思不是
“say.com\brothers”
,而是:
“say.com”
(退格)
“rothers”

问题是字符8不在允许的列表中,因此需要对其进行转义。。。XML转义,而不是Erlang转义。。。使XML有效

当字符串来自外部用户时,这将不是问题。反斜杠转义仅在Erlang源中的文字转换为内存中的字符串的过程中使用。如果读入包含反斜杠的外部字符串,则在打印时应看到它显示为双精度:
“\\”
是文本反斜杠的转义序列。因此,
“say.com\brothers”
将显示为
“say.com\\brothers”

如果您避开反斜杠,它将正常工作

> xmerl_scan:string("<tag>say.com\\brothers</tag>").
{{xmlElement,tag,tag,[],
             {xmlNamespace,[],[]},
             [],1,[],
             [{xmlText,[{tag,1}],1,[],"say.com\\brothers",text}],
             [],"/root",undeclared},
 []}
>xmerl\u扫描:字符串(“say.com\\brothers”)。
{{xmlElement,标记,标记,[],
{xmlNamespace,[],[]},
[],1,[],
[{xmlText,[{tag,1}],1,[],“say.com\\brothers”,text},
[],“/root”,未声明的},
[]}

这似乎只是测试方式的一个问题,不应该是外部数据的问题。但是,如果用户确实传递了无效的XML,那么正如您所观察到的,它将导致异常。要处理这种情况,您需要通过捕获出口或使用
catch

来明确检查它。您是否尝试过
erlsom
在此处找到:,我个人发现它比
xmerl
更稳定、更直接。我的应用程序由许多组件组成,并且所有组件都已经使用了xmerl。更改为erlsom不是一个选项,但感谢您的提示。嗨…感谢您的解释。文本通过套接字进入我的应用程序。所以,它以二进制流的形式出现,我用二进制_转换为_列表,然后用xmerl_扫描进行解析。我会看看我能做些什么来管理它。binary\u to\u列表应该为您处理这个问题:如果输入反斜杠字符,它将自动成为
“\\”
。也许他们在发送端也有类似的问题:在各种语言中使用了相同的反斜杠编码方法。结果表明,Java中的另一个组件使用JAXB创建了这个无效的XML并发送到我的erlang应用程序。JAXB有一个问题(自2009年以来),它允许创建包含控制字符(如“\b”)的XML,但在对它们进行解组时抛出异常。这个JAVA组件创建了无效的XML并发送到Erlang应用程序进行处理,因此问题出在JAXB中。
Char ::= #x9 | #xA | #xD | [#x20-#xD7FF] | [#xE000-#xFFFD] | [#x10000-#x10FFFF]
     /* any Unicode character, excluding the surrogate blocks, FFFE, and FFFF. */
> xmerl_scan:string("<tag>say.com\\brothers</tag>").
{{xmlElement,tag,tag,[],
             {xmlNamespace,[],[]},
             [],1,[],
             [{xmlText,[{tag,1}],1,[],"say.com\\brothers",text}],
             [],"/root",undeclared},
 []}