Есть такой код:
var doc = new XDocument(
new XElement("root",
new XElement(xname, xvalue)
));
, где xname и xvalue произвольные значения и могут содержать всякие бяки.
Так вот, если xvalue содержит спец. xml символы ('<', '>', '\"', '\'', '&'), они благополучно эскейпятся и проблем не возникает.
А вот с xname такое не проходит.
Google подсказал замечательный класс SecurityElement с методом Escape, но он не подходит.
Во-первых, имя тега не может содержать спец. символов даже в заескейпаном виде (пример ексепшена: The '&' character, hexadecimal value 0x26, cannot be included in a name.).
А во-вторых на него распространяются и другие ограничения, например: Name cannot begin with the '.' character, hexadecimal value 0x2E (имя не может начинаться с '.' символа).
Вопрос: как кошерно заескейпить или хотя бы проверить на валидность имя тега (SecurityElement.IsValidTag(xname) возвращает true для xname с '.' вначале) + ткните пжалста где эти правила популярно расписаны — в крайнем случае придется ручками вызывать string.replace...
Здравствуйте, Dracula_DIS, Вы писали:
D_D>Регулярные выражения не подходят?
Подходят, самому написать не проблема.
Больше интересуют ответы на вопросы: "как проверить на валидность имя тега" и "ткните где эти правила популярно расписаны".
Например я не знал, что имя не может начинаться с точки
Здравствуйте, SHEMA, Вы писали:
SHE>Вопрос: как кошерно заескейпить или хотя бы проверить на валидность имя тега (SecurityElement.IsValidTag(xname) возвращает true для xname с '.' вначале) + ткните пжалста где эти правила популярно расписаны — в крайнем случае придется ручками вызывать string.replace...
Проверить просто. Смотрим
2.3 Common Syntactic Constructs
NameStartChar ::= ":" | [A-Z] | "_" | [a-z] | xC0-#xD6 | xD8-#xF6 | xF8-#x2FF | x370-#x37D | x37F-#x1FFF | x200C-#x200D | x2070-#x218F | x2C00-#x2FEF | x3001-#xD7FF | xF900-#xFDCF | xFDF0-#xFFFD | x10000-#xEFFFF
NameChar ::= NameStartChar | "-" | "." | [0-9] | #xB7 | x0300-#x036F | x203F-#x2040
Name ::= NameStartChar (NameChar)*
А вот как эскейпить — тут уж сам решай.
Здравствуйте, Lloyd, Вы писали:
L>Как вариант: XmlConvert.EncodeLocalName
то что доктор прописал