LinqToXml, спец. символы в имени тегов
От: SHEMA  
Дата: 23.11.09 19:36
Оценка:
Есть такой код:

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...
Re: LinqToXml, спец. символы в имени тегов
От: Dracula_DIS Россия  
Дата: 23.11.09 21:00
Оценка:
Регулярные выражения не подходят?
Say I...
Re[2]: LinqToXml, спец. символы в имени тегов
От: SHEMA  
Дата: 23.11.09 21:21
Оценка:
Здравствуйте, Dracula_DIS, Вы писали:

D_D>Регулярные выражения не подходят?

Подходят, самому написать не проблема.
Больше интересуют ответы на вопросы: "как проверить на валидность имя тега" и "ткните где эти правила популярно расписаны".
Например я не знал, что имя не может начинаться с точки
Re: LinqToXml, спец. символы в имени тегов
От: _FRED_ Черногория
Дата: 24.11.09 06:37
Оценка: 2 (1)
Здравствуйте, 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)*


А вот как эскейпить — тут уж сам решай.
Help will always be given at Hogwarts to those who ask for it.
Re: LinqToXml, спец. символы в имени тегов
От: Lloyd Россия  
Дата: 24.11.09 06:52
Оценка: 17 (2)
Здравствуйте, SHEMA, Вы писали:

SHE>Вопрос: как кошерно заескейпить или хотя бы проверить на валидность имя тега (SecurityElement.IsValidTag(xname) возвращает true для xname с '.' вначале) + ткните пжалста где эти правила популярно расписаны — в крайнем случае придется ручками вызывать string.replace...


Как вариант: XmlConvert.EncodeLocalName
Re[2]: LinqToXml, спец. символы в имени тегов
От: SHEMA  
Дата: 24.11.09 12:44
Оценка:
Здравствуйте, Lloyd, Вы писали:

L>Как вариант: XmlConvert.EncodeLocalName


то что доктор прописал
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.