2011-04-10 71 views
5

我正在使用XElement对象在ASP.NET页面的代码隐藏中构建一些HTML。如何避免System.Xml.Linq.XElement转义HTML内容?

我可能还是有些XAttributes我走,以下列方式可能不会添加到此的XElement:

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

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

所以,如果我有:

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

然后我用下面的代码渲染成一个占位符对象是:

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父对象而不是转义内部内容?我怎样才能以原生格式保留它?

回答

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

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

HtmlTextWriter类被标记为'MustInherit',所以凭借我有限的知识,我不确定如何最好地将HtmlTextWriter实现到我的XElement对象中。我知道这是一个很大的问题,但是你能否提供一个简短的例子,说明如何将一个HtmlTextWriter对象转换成( hello world'')? – awj 2011-04-10 19:21:53

+0

我还应该提一下,我很喜欢使用XElement类,因为我使用的定制缓存接受XElements,但我不确定它是否会接受HtmlTextWriter的实例。 另外,你是否建议我用HtmlTextWriter替换整个XElement,而不是使用它来简单地包含内部HTML? – awj 2011-04-10 19:31:40

+0

@awj查看我的更新后的使用情况。我不明白你在说什么MustInherit,但无论如何,这个类是公开的,已经实现。我建议为了构建html,HtmlTextWriter比XElement更简单和强大。 XElement更通用 – archil 2011-04-10 19:35:36

0

如果你是治疗的HTML作为XML,然后当你添加到它,你必须添加XML

因此,你会作出新的XMLELEMENT(跨度),添加一个属性(属性id,值内容),然后将其内容设置为“hello world”。拿这个xmlelement并将其添加到树中的正确位置。

所有这些似乎都是朝着错误的方向走向我。如果你想在后面的代码中拥有“动态”内容,我会建议:向页面添加一个asp:labelaps:placeholder控件,然后将该控件的内容设置为后面代码中的html。这是添加动态内容的标准方式。

+0

我这样构建内容的原因是我想要缓存页面的元素 - 为了实现这种情况,这些元素必须是可序列化的。 XElement内部的内容来自CMS中的HTML字段。 我希望向所有读者解释为什么我要使用XElement来实现包含HTML的结果。 – awj 2011-04-10 19:42:34

+0

@awj - 没有错。 'asp:placeholder'可以很好地处理数据库中的字符串。没有什么比字符串更可序列化。 – Hogan 2011-04-10 20:14:53

+0

@awj - 实际上'asp:literalcontrol'或'asp:label'可能就是你想要的。你想让我发表一个如何使用它的例子吗? – Hogan 2011-04-10 20:19:09

0

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

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

有一点需要在每个元素上完成检查,但它完美的工作,并且比我开始构建它时预期的代码行少。