2011-04-10 9 views
5

Estoy usando el objeto XElement para construir algo de HTML en el código subyacente en una página ASP.NET.Cómo evitar System.Xml.Linq.XElement escaparse de contenido HTML?

que puede o no puede agregar algunos XAttributes a este XElement a medida que avanzo, de la siguiente manera:

var elmnt = new XElement("div", 
    new XAttribute("id", "myDiv"), 
    ); 

Ahora, si quiero añadir algo de contenido en myDiv que contiene HTML, el XElement escapa automáticamente de esto, lo cual, en mi situación, no es deseable.

Así que si tengo:

var elmnt = new XElement("div", 
    new XAttribute("id", "myDiv"), 
    "<span id='content'>hello world</span>" 
    ); 

Y entonces me hacen esto en un objeto marcador de posición usando el siguiente código:

myPlaceholder.Controls.Add(new System.Web.UI.WebControls.Literal { Text = elmnt.CreateNavigator().OuterXml }); 

Cuando se carga la página, la fuente revela que el contenido interno en el interior elmnt se ha escapado y tiene el siguiente formato en la fuente de la página:

&lt;span id='content'&gt;hello world&lt;/span&gt; 

Dado que el XML que estoy compilando aquí es HTML válido, y el contenido interno también es HTML válido, ¿cómo puedo decirle al objeto padre de XElement que no escape el contenido interno? ¿Cómo puedo dejarlo en su formato nativo?

Respuesta

7
var elmnt = new XElement("div", 
    new XAttribute("id", "myDiv"), 
    new XRaw("<span id='content'>hello world</span>") 
); 


public class XRaw : XText 
{ 
    public XRaw(string text):base(text){} 
    public XRaw(XText text): base(text){} 

    public override void WriteTo(System.Xml.XmlWriter writer) 
    { 
    writer.WriteRaw(this.Value); 
    } 
} 
-1

¿por qué no usar HtmlTextWriter?

StringWriter stringWriter = new StringWriter(); 

HtmlTextWriter htmlWriter = new HtmlTextWriter(stringWriter); 
htmlWriter.RenderBeginTag(HtmlTextWriterTag.Span); 
htmlWriter.AddAttribute(HtmlTextWriterAttribute.Id, "content"); 
htmlWriter.Write("hello world"); 
htmlWriter.RenderEndTag(); 

htmlWriter.Flush(); 

stringWriter.ToString(); //<span id='content'>hello world</span> 
+0

la clase HtmlTextWriter se marca como 'MustInherit', así que con mi conocimiento limitado No estoy seguro de la mejor manera de poner en práctica un HtmlTextWriter en mi objeto XElement. Sé que es una gran pregunta, pero ¿podrías dar un pequeño ejemplo de cómo convertiría (usando mi ejemplo anterior) ' hello world' en un objeto HtmlTextWriter? – awj

+0

También debo mencionar que estoy dispuesto a utilizar la clase XElement porque estoy usando un caché personalizado que acepta XElements, pero no estoy seguro de si aceptará una instancia de HtmlTextWriter. Además, ¿sugiere que sustituya todo el XElement con un HtmlTextWriter en lugar de usarlo para contener simplemente el HTML interno? – awj

+0

@awj ver mi publicación actualizada sobre el uso. No entiendo de qué MustInherit está hablando, pero de todos modos, esta clase es pública y ya está implementada. Sugiero que para compilar html, HtmlTextWriter es mucho más simple y poderoso que XElement. XElement es más general – archil

0

Si se está tratando el código HTML como XML y luego cuando se agrega a ello hay que añadir XML

Así que haría una nueva XmlElement (SPAN), agregue un atributo (para identificación de atributo, contenido de valor) y luego configure su contenido en "mundo hello". Toma este xmlelement y agrégalo al árbol en el lugar correcto.

Todo esto parece dirigirse en la dirección incorrecta para mí. Si desea poder tener contenido "dinámico" en el código subyacente, sugeriría: agregar un control asp:label o aps:placeholder a la página y luego establecer el contenido de ese control en html en el código subyacente. Esta es la forma estándar de agregar contenido dinámico.

+0

La razón por la que estoy compilando el contenido de esta manera es porque quiero almacenar en caché elementos de la página; para que esto ocurra, estos elementos deben ser serializables. El contenido dentro de XElement proviene de un campo HTML en un CMS. Espero que les explique a todos los lectores mi pregunta acerca de por qué estoy buscando lograr un resultado utilizando XElement para contener HTML. – awj

+0

@awj - nada de malo en eso. Un 'asp: placeholder' podría manejar una cadena de su base de datos sin problemas. Nada es más serializable que una cadena. – Hogan

+0

@awj - en realidad un 'asp: literalcontrol' o' asp: label' es probablemente lo que quieres. ¿Quieres que publique un ejemplo de cómo usarlo? – Hogan

0

Lo resolví utilizando HtmlAgilitypack para convertir la cadena de HTML en un objeto jerárquico.

Luego hice un bucle a través de cada elemento HTML en este objeto y creé un XElement anidado para cada uno.

Hay un poco de comprobación que se necesita hacer en cada elemento, pero funciona perfectamente y tiene menos líneas de código de las que esperaba cuando comencé a construirlo.

Cuestiones relacionadas