2009-06-08 16 views
7

Estoy tratando de usar Linq a XML para guardar & recuperar algo de HTML entre un archivo XML y una aplicación de formularios de Windows. Cuando lo guarda en el archivo XML, las etiquetas HTML se codifican en xml y no se guarda como HTML directo.¿Cómo guardar HTML en un archivo XML usando Linq a XML?

Ejemplo HTML:

<P><FONT color=#004080><U>Sample HTML</U></FONT></P> 

guardará en el archivo XML:

&lt;P&gt;&lt;FONT color=#004080&gt;&lt;U&gt;Sample HTML&lt;/U&gt;&lt;/FONT&gt;&lt;/P&gt; 

Cuando editar manualmente el archivo XML y poner en el código HTML deseado del Linq tira en el código HTML y lo muestra correctamente.

Este es el código que guarda el código HTML para el archivo XML:

XElement currentReport = (from item in callReports.Descendants("callReport") 
            where (int)item.Element("localId") == myCallreports.LocalId 
            select item).FirstOrDefault(); 

     currentReport.Element("studio").Value = myCallreports.Studio; 
     currentReport.Element("visitDate").Value = myCallreports.Visitdate.ToShortDateString(); 
     // *** The next two XElements store the HTML 
     currentReport.Element("recomendations").Value = myCallreports.Comments; 
     currentReport.Element("reactions").Value = myCallreports.Ownerreaction; 

Asumo que esto está sucediendo b/c de codificación XML pero no estoy seguro de cómo tratar con él. This question me dio algunas pistas ... pero ninguna respuesta (para mí, al menos).

Gracias por la ayuda,

Oran

Respuesta

5

Al establecer la propiedad Valor codificará automáticamente la cadena html. Esto debería ser el truco, pero deberá asegurarse de que su HTML sea XML válido (XHTML).

currentReport.Element("recomendations").ReplaceNodes(XElement.Parse(myCallreports.Comments)); 

Editar: Es posible que necesite para envolver el usuario ha introducido HTML en <div> </div> etiquetas. XElement.Parse espera encontrar una cadena con al menos una etiqueta xml de inicio y finalización. Por lo tanto, esto podría funcionar mejor:

currentReport.Element("recomendations").ReplaceNodes(XElement.Parse("<div>" + myCallreports.Comments + "</div>")); 

A continuación, sólo tiene que asegurarse de que las etiquetas como <br> se envían en tan <br />.

Editar 2: La otra opción sería usar XML CDATA. Envuelva el HTML con <![CDATA[ y ]]>, pero en realidad nunca lo he usado y no estoy seguro de cómo afecta la lectura del xml.

currentReport.Element("recomendations").ReplaceNodes(XElement.Parse("<![CDATA[" + myCallreports.Comments + "]]>")); 
+0

Gracias por la respuesta. ¡Funcionó! Pero ahora estoy teniendo un problema al validar el HTML. Estoy usando este control http://www.codeproject.com/KB/edit/editor_in_windows_forms.aspx para permitir a los usuarios crear el HTML y no parece tener XHTML válido. Supongo que tengo que encontrar un nuevo control de HTML, formatear el código HTML o usar otro método para guardar el HTML en XML. ¿Alguna sugerencia? – orandov

+0

Ya había intentado empaquetar el html en una etiqueta, pero el problema es que el control de HTML Editor que estoy usando produce XHTML no válido – orandov

+2

¡Muchas gracias Dennis! ¡CData funciona! Aquí está el uso de Linq To XML de CData currentReport.Element ("recomendations"). ReplaceNodes (new XCData (myRbccallreports.Comments)); – orandov

-1

Trate de usar currentReport.Element("studio").InnerXml en lugar de currentReport.Element("studio").Value

+0

No veo InnerXml como un miembro de XElement. http://msdn.microsoft.com/en-us/library/system.xml.linq.xelement_members.aspx – CoderDennis