Como garantir que uma entidade XML tenha um nome válido
-
26-09-2019 - |
Pergunta
Eu tenho um aplicativo que gera um monte de XML com base em alguns dados de uma fonte que eu não controlo. Basicamente, estou transformando esses dados em um documento XML para servir através de feeds RSS. Eu posso estar recebendo dados como
2_br=1
3_br=0
E estou transformando isso no seguinte XML
<2_br>1</2_br>
<3_br>0</3_br>
Obviamente, uma tag XML não pode começar com um dígito. Não consegui encontrar em nenhum lugar uma lista de caracteres válidos. Existe em algum lugar? Eu basicamente vou apenas prefixar e inválido de personagem inicial ou substituir um caractere inválido em linha por um _
.
Não é difícil de fazer, mas basicamente não consigo encontrar uma lista de caracteres inválidos para um nome de tag XML.
Solução
Que tal agora:Linguagem de marcação extensível (XML) 1.0 (Quinta Edição)
Namestartchar :: = ":" | [AZ] | "_" | [AZ] | [#xc0-#xd6] | [#xd8-#xf6] | [#xf8-#x2ff] | [#x370-#x37D] | [#x37f-#x1fff] | [#x200C-#x200D] | [#x2070-#x218f] | [#x2C00-#x2FEF] | [#x3001-#xd7ff] | [#xf900-#xfdcf] | [#xfdf0-#xfffd] | [#x10000-#xeffff
Outras dicas
XmlConvert.IsNCNameChar()
e
XmlConvert.IsStartNCNameChar()
pode ser usado para validar um nome de marca XML:
char[] validTagNameChars = pDesiredTagName.Where(ch => XmlConvert.IsNCNameChar(ch)).ToArray();
string validTagName = new string (validTagNameChars);
if (validTagName == "" || !XmlConvert.IsStartNCNameChar(validTagName[0]))
validTagName = "_" + validTagName;