如何避免System.Xml.Linq.XElement转义HTML内容?

时间:2011-04-10 18:54:57

标签: asp.net html escaping xelement

我正在使用XElement对象在ASP.NET页面的代码隐藏中构建一些HTML。

我可能会或者可能不会在此过程中向此XElement添加一些XAttributes,方式如下:

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

现在,如果我想在包含HTML的 myDiv 中添加一些内容,那么XElement会自动转义,在我的情况下,这是不可取的。

所以,如果我有:

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

然后使用以下代码将其渲染到Placeholder对象中:

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

当页面加载时,源会显示 elmnt 中的内部内容已被转义,并且在页面源中具有以下格式:

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

鉴于我在这里编译的XML是有效的HTML,并且内部内容也是有效的HTML,我怎样才能告诉XElement父对象转义内部内容?如何将其保留为原生格式?

4 个答案:

答案 0 :(得分:8)

 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 :(得分:0)

如果您将HTML视为XML,那么当您添加HTML时,您必须添加XML

因此,您将创建一个新的xmlelement(span),添加一个属性(对于属性id,值内容),然后将其内容设置为“hello world”。拿这个xmlelement并将它添加到正确位置的树上。

所有这些似乎都朝着错误的方向前进。如果您希望能够在后面的代码中包含“动态”内容,我建议:向页面添加asp:labelaps:placeholder控件,然后将该控件的内容设置为html中的html代码背后。这是添加动态内容的标准方法。

答案 2 :(得分:0)

我通过使用HtmlAgilitypack将HTML字符串转换为分层对象来解决这个问题。

然后,我循环遍历此对象中的每个HTML元素,并为每个HTML元素创建一个嵌套的XElement。

有一些检查需要对每个元素进行检查,但它完美运行并且代码行数比我开始构建时所预期的少。

答案 3 :(得分:-1)

为什么不使用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>