I\'m using the XElement object to build some HTML in the code-behind on an ASP.NET page.
I may or may not add some XAttributes to this XElement as I go along, in the
I resolved this by using the HtmlAgilitypack to convert the string of HTML into a hierarchical object.
I then looped through each HTML element in this object and created a nested XElement for each.
There's a little bit of checking that needs done on every element, but it works perfectly and has fewer lines of code than I expected when I started building it.
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);
}
}
Why wouldn't you use 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>
If you are treating the HTML as XML then when you add to it you have to add XML
Thus you would make a new xmlelement (span), add an attribute (for attribute id, value content) and then set it's contents to "hello world". Take this xmlelement and add it to the tree in the right spot.
All of this seems to be heading in the wrong direction to me. If you want to be able to have "dynamic" content in the code behind I would suggest: adding a asp:label
or aps:placeholder
control to the page and then setting the content of that control to the html in the code behind. This is the standard way of adding dynamic content.