В приведенном выше примере это нарушение спецификации 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 символ обратной косой черты используется дляescape последовательности«\ b» является escape-последовательностью для символа 8 (символ возврата на одну позицию), поэтому вместо значения "say.com\brothers"
это означает: "say.com"
(возврат на одну позицию) "rothers"
.
Проблема заключается в том, что символ 8отсутствует в списке разрешенных, поэтому его необходимо экранировать ... XML-экранирование, а не Erlang-экранирование ..., чтобы сделать XML действительным.
Когда строка поступает от внешнего пользователя, это не будетпроблема.Экранирование обратной косой черты используется только в процессе, когда литерал в источнике Erlang преобразуется в строку в памяти.Если вы читаете внешнюю строку, содержащую обратную косую черту, вы должны увидеть, что она выглядит двойной при печати: "\\"
- escape-последовательность для буквенной обратной косой черты.Таким образом, "<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
.