2011-07-20 33 views
25

Tengo una cadena (de un elemento CDATA) que contiene una descripción de XML. Necesito decodificar esta cadena en una nueva cadena que muestra los caracteres correctamente utilizando C#Cómo decodificar cadena a cadena XML en C#

cadena existente:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?><myreport xmlns="http://test.com/rules/client"><admin><ordernumber>123</ordernumber><state>NY</state></report></myreport> 

Cadena Se busca:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?> 
<myreport xmlns="http://test.com/rules/client"> 
<admin><ordernumber>123</ordernumber><state>NY</state></report></myreport> 
+0

pero su cadena existente es válido * * – naveen

+0

@naveen: Seguramente eso es sólo el _contenido_ de la cadena ... –

+0

@ Jeff Mercado: estaba usando LINQPad para escribir una respuesta cuando vi la cadena no es válida y 'won HtmlDecode' no funciona, ya que acepta 'cadena'. Merley señaló que nuestro OP necesita escapar '' 'también. – naveen

Respuesta

5

Como Kirill y msarchet dijo, puede utilizar HttpUtility.HtmlDecode de System.Web. Se escapa de casi todo lo correcto.

Si no desea hacer referencia System.Web que podría utilizar un poco de truco que soporta todos XML escapar, pero no específico de HTML escapar como &eacute;:

public static string XmlDecode(string value) { 
    var xmlDoc = new XmlDocument(); 
    xmlDoc.LoadXml("<root>" + value + "</root>"); 
    return xmlDoc.InnerText; 
} 

También es posible usar un RegEx o simple string.Replace pero solo admitiría escapes XML básicos. Cosas como &#x410; o &eacute; son ejemplos que serían más difíciles de admitir.

+0

No analizaría XML/HTML con RegEx: http://stackoverflow.com/questions/1732348/regex-match-open-tags-except-xhtml -self-contained-tags/ – cederlof

+0

(aunque me gustó el método XmlDocument) +1 – cederlof

-1

También puede considerar el método de análisis estático de XDocument. No estoy seguro de cómo se compara con otros mencionados aquí, pero parece analizar bien estas cadenas.

Una vez que el XDocument resultante, que podría dar la vuelta con ToString para obtener la cadena de nuevo:

string parsedString = XDocument.Parse("<My XML />").ToString(); 
1

Puede utilizar HTML.Raw. De esa forma, el marcado no está codificado.

+0

¿Puede proporcionar algún código de muestra para explicar mejor su respuesta? – winhowes

0

Solo necesita reemplazar los caracteres escapados con sus originales.

string stringWanted= existingString.Replace("&lt;", "<") 
                .Replace("&amp;", "&") 
                .Replace("&gt;", ">") 
                .Replace("&quot;", "\"") 
                .Replace("&apos;", "'"); 
+0

Bueno, eso es muy extraño.Acabo de [producir un ejemplo] (https://dotnetfiddle.net/vRfBTE) que esperaba demostrar el problema, y ​​funciona exactamente como se desea. Lo que lo hace extraño es que * sé * que esta situación exacta es responsable de un error de análisis XML en una base de código que mantengo que arreglé * ayer *. Al menos, creo que es exactamente lo mismo. Cancelaré el downvote y eliminaré mi comentario original hasta que tenga la oportunidad de verificarlo. –

0

Su WebUtility.HtmlDecode ahora de System.Net.