How to avoid System.Xml.Linq.XElement escaping HTML content?

蓝咒 提交于 2019-11-30 21:40:09
 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);
  }
}

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.

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.

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>
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!