¿Existe alguna función de C # que pueda usarse para escapar y anular el escape de una cadena, que podría usarse para completar el contenido de un elemento XML?
Estoy usando VSTS 2008 + C # + .Net 3.0.
EDITAR 1: Estoy concatenando un archivo XML simple y corto y no uso la serialización, por lo que necesito escapar explícitamente el carácter XML a mano, por ejemplo, necesito a<b
ingresar <foo></foo>
, así que necesito una cadena de escape a<b
y ponerla en el elemento foo.
new XText(unescaped).ToString()
Respuestas:
fuente
HttpUtility.HtmlEncode
deSystem.Web
seguridad se podría utilizar?SecurityElement.Escape (cadenas)
fuente
EDITAR: Dice "Estoy concatenando un archivo XML simple y corto y no uso la serialización, por lo que necesito escapar explícitamente del carácter XML a mano".
Le recomiendo encarecidamente que no lo haga a mano. Use las API XML para hacerlo todo por usted: lea los archivos originales, combine los dos en un solo documento como lo necesite (probablemente quiera usarlo
XmlDocument.ImportNode
) y luego escríbalo nuevamente. No desea escribir sus propios analizadores / formateadores XML. La serialización es algo irrelevante aquí.Si nos puede dar un ejemplo breve pero completo de exactamente lo que está tratando de hacer, probablemente podamos ayudarlo a evitar tener que preocuparse por escapar en primer lugar.
Respuesta original
No está del todo claro lo que quiere decir, pero normalmente las API XML lo hacen por usted. Establece el texto en un nodo y automáticamente escapará de todo lo que necesite. Por ejemplo:
Ejemplo de LINQ to XML:
Ejemplo de DOM:
Salida de ambos ejemplos:
Eso es asumiendo que desea que XML escape, por supuesto. Si no es así, publique más detalles.
fuente
Gracias a @sehe por el escape de una línea:
Le agrego el un-escape de una línea:
fuente
George, es simple. Utilice siempre las API XML para manejar XML. Ellos hacen todo el escape y desaparición por ti.
Nunca cree XML agregando cadenas.
fuente
XmlElementSyntax
. Y también es complicado por el hecho de que también necesita generar el///
. Y no puedo generar cada línea por separadoXObject
, porque eso no funcionaría para etiquetas multilínea.///
al frente y luego vuelva a formatear el código. No es un gran problema, y ciertamente es un caso de esquina. Si es absolutamente necesario, estoy seguro de que puede crear una costumbreXmlWriter
para hacer saltos de línea y espacios en blanco de la forma que desee, pero colocándolos///
delante de nuevas líneas. Alternativamente, use un XSLT para imprimir de forma bonita el XML. Pero en cualquier caso, XML debería ser generado por una API XML.Y si desea, como yo cuando encontré esta pregunta, escapar de los nombres de nodo XML, como por ejemplo al leer de una serialización XML, use la forma más fácil:
También escapará espacios y cualquier carácter no válido para elementos XML.
http://msdn.microsoft.com/en-us/library/system.security.securityelement.escape%28VS.80%29.aspx
fuente
ADVERTENCIA: Nigromante
Aún así, la respuesta de Darin Dimitrov + System.Security.SecurityElement.Escape (string s) no está completa.
En XML 1.1, la forma más sencilla y segura es simplemente codificar TODO.
Como
	
para \ t.No se admite en absoluto en XML 1.0.
Para XML 1.0, una posible solución es codificar en base 64 el texto que contiene los caracteres.
XML 1.0:
fuente
Otra toma basada en la respuesta de John Skeet que no devuelve las etiquetas :
Esto devuelve solo el valor pasado, en formato codificado XML:
fuente
Las siguientes funciones harán el trabajo. No probé contra XmlDocument, pero supongo que esto es mucho más rápido.
fuente
Usando una biblioteca de terceros ( Newtonsoft.Json ) como alternativa:
Ejemplo:
a<b
<==>"a<b"
<foo></foo>
<==>"foo></foo>"
fuente