Existe alguma função C # que poderia ser usada para escapar e cancelar o escape de uma string, que poderia ser usada para preencher o conteúdo de um elemento XML?
Estou usando o VSTS 2008 + C # + .Net 3.0.
EDIT 1: Estou concatenando um arquivo XML simples e curto e não uso a serialização, então preciso escapar explicitamente o caractere XML à mão, por exemplo, preciso colocar a<b
em <foo></foo>
, portanto, preciso escapar da string a<b
e colocá-la no elemento foo.
new XText(unescaped).ToString()
Respostas:
fonte
HttpUtility.HtmlEncode
fromSystem.Web
poderia ser usado com segurança?SecurityElement.Escape (string s)
fonte
EDIT: Você diz "Estou concatenando um arquivo XML simples e curto e não uso a serialização, então preciso escapar explicitamente do caractere XML manualmente".
Eu recomendo fortemente que você não faça isso manualmente. Use as APIs XML para fazer tudo por você - leia os arquivos originais, mescle os dois em um único documento da maneira que for necessário (provavelmente você deseja usar
XmlDocument.ImportNode
) e, em seguida, escreva novamente. Você não quer escrever seus próprios analisadores / formatadores XML. A serialização é um tanto irrelevante aqui.Se você puder nos dar um exemplo breve, mas completo, de exatamente o que está tentando fazer, provavelmente podemos ajudá-lo a evitar a preocupação de escapar em primeiro lugar.
Resposta original
Não está totalmente claro o que você quer dizer, mas normalmente APIs XML fazem isso para você. Você define o texto em um nó e ele automaticamente escapará de tudo o que for necessário. Por exemplo:
Exemplo de LINQ to XML:
Exemplo DOM:
Resultado de ambos os exemplos:
Isso presumindo que você deseja escape de XML, é claro. Se não estiver, poste mais detalhes.
fonte
Agradecimentos a @sehe pelo escape de uma linha:
Acrescento a ele o un-escape de uma linha:
fonte
George, é simples. Sempre use as APIs XML para lidar com XML. Eles fazem todas as fugas e unescaping para você.
Nunca crie XML anexando strings.
fonte
XmlElementSyntax
. E também é complicado pelo fato de que você precisa gerar o///
também. E não posso gerar cada linha separadamenteXObject
, porque isso não funcionaria para tags de várias linhas .///
na frente dele e reformate o código. Não é um grande problema, e certamente um caso secundário. Se for absolutamente necessário, tenho certeza que você pode criar um costumeXmlWriter
para fazer quebras de linha e espaços em branco da maneira que desejar, mas colocando///
na frente de novas linhas. Como alternativa, use um XSLT para fazer uma impressão bonita do XML. Mas, em qualquer caso, o XML ainda deve ser gerado por uma API XML.E se você quiser, como eu quando encontrei esta pergunta, escapar dos nomes de nós XML, como por exemplo ao ler de uma serialização XML, use a maneira mais fácil:
Ele também escapará de espaços e quaisquer caracteres inválidos para elementos XML.
http://msdn.microsoft.com/en-us/library/system.security.securityelement.escape%28VS.80%29.aspx
fonte
AVISO: Necromante
Ainda assim, a resposta de Darin Dimitrov + System.Security.SecurityElement.Escape (string s) não está completa.
No XML 1.1, a maneira mais simples e segura é apenas codificar TUDO.
Gostar
	
de \ t.Não tem suporte em XML 1.0.
Para XML 1.0, uma solução possível é codificar em base 64 o texto que contém o (s) caractere (s).
XML 1.0:
fonte
Outra abordagem baseada na resposta de John Skeet que não retorna as tags :
Isso retorna apenas o valor passado, em formato codificado em XML:
fonte
As funções a seguir farão o trabalho. Não testei com o XmlDocument, mas acho que é muito mais rápido.
fonte
Usando uma biblioteca de terceiros ( Newtonsoft.Json ) como alternativa:
Exemplo:
a<b
<==>"a<b"
<foo></foo>
<==>"foo></foo>"
fonte