2011-04-10 36 views
5

Tôi đang sử dụng đối tượng XElement để xây dựng một số HTML trong mã-đằng sau trên một trang ASP.NET.Làm cách nào để tránh System.Xml.Linq.XElement thoát khỏi nội dung HTML?

tôi có thể hoặc không thêm một số XAttributes để XElement này như tôi đi cùng, trong thời trang sau:

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

Bây giờ, nếu tôi muốn thêm một số nội dung vào myDiv chứa HTML, XElement tự động thoát khỏi điều này, trong tình huống của tôi, là không mong muốn.

Vì vậy, nếu tôi có:

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

Và sau đó tôi làm điều này vào một đối tượng giữ chỗ bằng cách sử dụng đoạn mã sau:

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

Khi tải trang, các nguồn tiết lộ rằng nội dung bên trong bên trong elmnt đã được thoát và có định dạng sau trong nguồn của trang:

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

Cho rằng XML tôi đang biên dịch ở đây là HTML hợp lệ và nội dung bên trong cũng là HTML hợp lệ, làm thế nào tôi có thể nói đối tượng chalement của XElement là không phải là thoát khỏi nội dung bên trong? Làm thế nào tôi có thể để nó ở định dạng gốc?

Trả lời

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

Tại sao bạn không sử dụng 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

lớp HtmlTextWriter được đánh dấu là 'MustInherit', vì vậy với kiến ​​thức hạn chế của tôi, tôi không chắc cách tốt nhất để triển khai HtmlTextWriter vào đối tượng XElement của tôi. Tôi biết đó là một yêu cầu lớn nhưng bạn có thể cung cấp một ví dụ ngắn về cách tôi chuyển đổi (sử dụng ví dụ trên) ' hello world' vào đối tượng HtmlTextWriter không? – awj

+0

Tôi cũng nên đề cập đến rằng tôi muốn sử dụng lớp XElement bởi vì tôi đang sử dụng một bộ nhớ cache riêng biệt chấp nhận XElements, nhưng tôi không chắc chắn nếu nó sẽ chấp nhận một thể hiện của một HtmlTextWriter. Ngoài ra, bạn có gợi ý rằng tôi thay thế toàn bộ XElement bằng một HtmlTextWriter thay vì sử dụng nó để chỉ chứa HTML bên trong? – awj

+0

@awj xem bài đăng cập nhật của tôi về cách sử dụng. Tôi không hiểu những gì MustInherit bạn đang nói về, nhưng dù sao, lớp này là công khai và đã được thực hiện. Tôi đề nghị rằng để xây dựng html, HtmlTextWriter là đơn giản hơn nhiều và mạnh mẽ hơn XElement. XElement là tổng quát hơn – archil

0

Nếu bạn đang điều trị các HTML như XML sau đó khi bạn thêm vào đó bạn phải thêm XML

Vì vậy bạn sẽ làm cho một XMLELEMENT mới (khoảng), thêm một thuộc tính (cho thuộc tính id, nội dung giá trị) và sau đó đặt nội dung của nó thành "hello world". Lấy xmlelement này và thêm nó vào cây ở đúng vị trí.

Tất cả điều này dường như đang đi sai hướng với tôi. Nếu bạn muốn có thể có nội dung "động" trong mã phía sau, tôi sẽ đề xuất: thêm điều khiển asp:label hoặc aps:placeholder vào trang và sau đó đặt nội dung của điều khiển đó thành html trong mã phía sau. Đây là cách tiêu chuẩn để thêm nội dung động.

+0

Lý do tôi tạo nội dung theo cách này là tôi muốn lưu các phần tử của trang - để điều này xảy ra, các phần tử này phải được tuần tự hóa. Nội dung bên trong XElement đến từ một trường HTML trong CMS. Tôi hy vọng rằng giải thích cho tất cả độc giả của câu hỏi của tôi tại sao tôi đang tìm kiếm để đạt được một kết quả bằng cách sử dụng XElement để chứa HTML. – awj

+0

@awj - không có gì sai với điều đó. Một 'asp: placeholder' có thể xử lý một chuỗi từ cơ sở dữ liệu của bạn tốt. Không có gì có thể tuần tự hóa nhiều hơn một chuỗi. – Hogan

+0

@awj - thực sự là một 'asp: literalcontrol' hoặc' asp: label' có lẽ là những gì bạn muốn. Bạn có muốn tôi đăng một ví dụ về cách sử dụng nó không? – Hogan

0

Tôi đã giải quyết vấn đề này bằng cách sử dụng HtmlAgilitypack để chuyển đổi chuỗi HTML thành một đối tượng phân cấp.

Sau đó, tôi lặp qua từng phần tử HTML trong đối tượng này và tạo một XElement lồng nhau cho mỗi đối tượng.

Có một chút kiểm tra cần thực hiện trên mọi phần tử, nhưng nó hoạt động hoàn hảo và có ít dòng mã hơn tôi mong đợi khi tôi bắt đầu xây dựng nó.

Các vấn đề liên quan