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。

有一點需要在每個元素上完成檢查,但它完美的工作,並且比我開始構建它時預期的代碼行少。