xmerl не распознает несколько символов - PullRequest
1 голос
/ 03 февраля 2012

У меня есть приложение, которое использует 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

Мой вопрос: у кого-нибудь уже была такая же проблема? Как я могу решить это?

Я знаю, что это также вызовет некоторые исключения, когда у меня есть:

\ б \ е \ е \ v \Икс \ 0 .. \ 7

в моей строке.

Спасибо

1 Ответ

3 голосов
/ 03 февраля 2012

В приведенном выше примере это нарушение спецификации 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.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...