Я использую HTMLAgilityPack, и я пытаюсь выбрать идентификатор элемента с двоеточием.
Using Fizzler.Systems.HtmlAgilityPack;
Тест №1 (Неизвестный псевдокласс)
HtmlNodeSelection.QuerySelectorAll( _htmlDocument.DocumentNode,"#unlocktheinbox:test");
Тест № 2 (Недопустимый символ в позиции 16.)
HtmlNodeSelection.QuerySelectorAll( _htmlDocument.DocumentNode,"#unlocktheinbox\\:test");
Тест № 3 (непризнанная escape-последовательность)
HtmlNodeSelection.QuerySelectorAll( _htmlDocument.DocumentNode,"#unlocktheinbox\3A test");
Тест № 4 (Недопустимый символ в позиции 16.)
HtmlNodeSelection.QuerySelectorAll( _htmlDocument.DocumentNode,"#unlocktheinbox\\3A test");
Что я делаю не так?
Оказывается, я посмотрел исходный код для Fizzler ..
// TODO Support full string syntax!
//
// string {string1}|{string2}
// string1 \"([^\n\r\f\\"]|\\{nl}|{nonascii}|{escape})*\"
// string2 \'([^\n\r\f\\']|\\{nl}|{nonascii}|{escape})*\'
// nonascii [^\0-\177]
// escape {unicode}|\\[^\n\r\f0-9a-f]
// unicode \\[0-9a-f]{1,6}(\r\n|[ \n\r\t\f])?
//
Они еще не поддерживают его :(
\3A
- ошибка времени компиляции, потому что \3
не является допустимой escape-последовательностью в строке C #, поэтому вам нужно избежать обратного слэш. Использование либо \\:
или \\3A
является правильным, но механизм выбора имеет проблемы с escape-последовательностями CSS по любой причине.
Посмотрите, можете ли вы обойти это с помощью селектора атрибутов, что устраняет необходимость в escape-последовательностях:
HtmlNodeSelection.QuerySelectorAll(_htmlDocument.DocumentNode, "[id='unlocktheinbox:test']");