2009-01-19 32 views
5

Tôi có tệp xml mà từ đó tôi trích xuất html bằng LINQ to XML. Đây là một mẫu của tập tin:Giữ các thẻ HTML trong XML bằng cách sử dụng LINQ to XML

<?xml version="1.0" encoding="utf-8" ?> 
<tips> 
    <tip id="0"> 
    This is the first tip. 
</tip> 
<tip id="1"> 
    Use <b>Windows Live Writer</b> or <b>Microsoft Word 2007</b> to create and publish content. 
</tip> 
<tip id="2"> 
    Enter a <b>url</b> into the box to automatically screenshot and index useful webpages. 
</tip> 
<tip id="3"> 
    Invite your <b>colleagues</b> to the site by entering their email addresses. You can then share the content with them! 
</tip> 
</tips> 

Tôi đang sử dụng các truy vấn sau đây để trích xuất một 'tip' từ file:

Tip tip = (from t in tipsXml.Descendants("tip") 
        where t.Attribute("id").Value == nextTipId.ToString() 
        select new Tip() 
        { 
        TipText= t.Value, 
        TipId = nextTipId 
        }).First(); 

Tôi có vấn đề là các yếu tố Html đang được tước ngoài. Tôi đã hy vọng cho một cái gì đó như InnerHtml để sử dụng thay vì giá trị, nhưng điều đó dường như không có ở đó.

Bất kỳ ý tưởng nào?

Cảm ơn tất cả trước,

Dave

Trả lời

8

Gọi t.ToString() thay vì Value. Điều đó sẽ trả về XML dưới dạng một chuỗi. Bạn có thể muốn sử dụng quá tải SaveOptions để tắt định dạng. Tôi không thể kiểm tra ngay bây giờ, nhưng tôi nghi ngờ nó sẽ bao gồm thẻ phần tử (và các phần tử), do đó bạn sẽ cần phải loại bỏ điều này.

Lưu ý rằng nếu HTML của bạn không phải là XML hợp lệ, bạn sẽ kết thúc với tệp XML tổng thể không hợp lệ.

Định dạng của tệp XML hoàn toàn nằm ngoài tầm kiểm soát của bạn? Sẽ tốt hơn nếu bất kỳ HTML bên trong nào được mã hóa XML.

EDIT: Một cách để tránh nhận được phần bên ngoài có thể làm điều gì đó như thế này (trong một phương pháp riêng biệt gọi là từ truy vấn của bạn, tất nhiên):

StringBuilder builder = new StringBuilder(); 
foreach (XNode node in element.Nodes()) 
{ 
    builder.Append(node.ToString()); 
} 

Bằng cách đó bạn sẽ nhận được các phần tử HTML với con cháu của họ và các nút văn bản xen kẽ. Về cơ bản nó tương đương với InnerXml, tôi rất nghi ngờ.

+1

heh, hãy nhấp vào chỉnh sửa. Mã hóa HTML bên trong XML là phổ biến và thuận tiện cho loại trường hợp này; thay thế sẽ là sử dụng XHTML hợp lệ, khai báo XHTML xmlns như mặc định và đưa các phần tử tip/tips vào một không gian tên khác để tránh nhầm lẫn cả hai. – bobince

0

TipText = t.Value,

XElement.value lợi nhuận chỉ văn bản mà là trực tiếp bên trong phần tử. Văn bản trong các phần tử lồng nhau - HTML hoặc cách khác - sẽ không được bao gồm và tất nhiên, bất kỳ tham chiếu nào có độ phân giải & sẽ xuất hiện ở dạng được giải mã của chúng.

Nếu bạn muốn nội dung dưới dạng chuỗi có đánh dấu, bạn có thể gọi XElement.ToString(), có thể với SaveOptions.DisableFormatting. Nhưng lưu ý điều này bao gồm phần tử gói < tip - có nghĩa là, trong thuật ngữ trình duyệt web DOM, đó là phần bên ngoàiHTML không phải là innerHTML. Để có được innerHTML bạn sẽ phải tham gia cùng với tất cả các ToString() s của XElement.Nodes con.

1

Chỉ cần sử dụng string.Concat(tip.Nodes()) để lấy nội dung có thẻ html

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