2009-01-19 19 views
5

Tengo un archivo xml del cual estoy extrayendo html usando LINQ to XML. Esta es una muestra del archivo:Mantener etiquetas HTML en XML usando LINQ to XML

<?xml version="1.0" encoding="utf-8" ?> 
<tips> 
    <tip id="0"> 
    This is the first tip. 
</tip> 
<tip id="1"> 
    Use <b>Windows Live Writer</b> or <b>Microsoft Word 2007</b> to create and publish content. 
</tip> 
<tip id="2"> 
    Enter a <b>url</b> into the box to automatically screenshot and index useful webpages. 
</tip> 
<tip id="3"> 
    Invite your <b>colleagues</b> to the site by entering their email addresses. You can then share the content with them! 
</tip> 
</tips> 

estoy usando la siguiente consulta para extraer una 'punta' del archivo:

Tip tip = (from t in tipsXml.Descendants("tip") 
        where t.Attribute("id").Value == nextTipId.ToString() 
        select new Tip() 
        { 
        TipText= t.Value, 
        TipId = nextTipId 
        }).First(); 

El problema que tengo es que los elementos HTML están siendo despojados fuera. Esperaba que se usara algo como InnerHtml en lugar de Value, pero eso no parece estar allí.

¿Alguna idea?

Gracias a todos de antemano,

de Dave

Respuesta

8

llamada t.ToString() en lugar de Value. Eso devolverá el XML como una cadena. Es posible que desee utilizar la sobrecarga tomando SaveOptions para deshabilitar el formateo. No puedo verificarlo ahora, pero sospecho que incluirá la etiqueta del elemento (y los elementos) por lo que necesitaría quitar esto.

Tenga en cuenta que si su HTML no es XML válido, terminará con un archivo XML global no válido.

¿El formato del archivo XML está completamente fuera de tu control? Sería más agradable que cualquier código HTML interno estuviera codificado en XML.

EDIT: Una forma de evitar conseguir la parte externa podría ser la de hacer algo como esto (en un método independiente llamada de consulta, por supuesto):

StringBuilder builder = new StringBuilder(); 
foreach (XNode node in element.Nodes()) 
{ 
    builder.Append(node.ToString()); 
} 

De esta manera obtendrá elementos HTML con sus descendientes y nodos de texto intercalados. Básicamente es el equivalente de InnerXml, sospecho fuertemente.

+1

je, broche de presión en la edición. La codificación de HTML dentro de XML es común y conveniente para este tipo de casos; la alternativa sería usar XHTML válido, declarar XHTML xmlns como predeterminado y poner los elementos de consejos/sugerencias en un espacio de nombres diferente para evitar confundir los dos. – bobince

0

TipText = t.value,

XElement.value devuelve sólo el texto que se encuentra directamente en el interior del elemento. El texto en elementos anidados - HTML u otros - no se incluirá, y por supuesto cualquier & -entidades-referencias aparecerán en su forma descodificada.

Si desea el contenido como una cadena con marcado, puede llamar a XElement.ToString(), posiblemente con SaveOptions.DisableFormatting. Pero tenga en cuenta que esto incluye el elemento < tip> de envoltura, es decir, en los términos DOM del navegador web, es el HTML externo, no el HTML interno. Para obtener el HTML interno, deberá unir todos los ToString() del secundario XElement.Nodes.

1

Sólo tiene que utilizar string.Concat(tip.Nodes()) para obtener el contenido con etiquetas html