2011-07-27 161 views
2

使用System.Linq.Xml中的類構建XML對象。但我一起工作的API要求我把直的HTML代碼到一個標籤:將HTML添加到XElement

<message><html><body>...</body></html></message> 

我似乎無法弄清楚如何做到這一點使用的XElement。

new XElement("message", myHtmlStringVariable); 

這只是逃避所有的HTML字符

new XElement("message", new XCData(myHtmlStringVariable)); 

包裝了HTML的<![CDATA[ ... ]]>該API犯規等。

那麼有沒有辦法直接將HTML插入到XElement的內容中?

回答

9

你可以這樣做:

string html = "<html><body></body></html>"; 
XElement message = new XElement("message", XElement.Parse(html)); 

這確實要求HTML是格式良好的XML和只有一個根元素。

如果你有多個根元素的HTML代碼片段,您可以隨時創建元素是這樣的:

string html = "<p>foo</p><p>bar</p>"; 
XElement message = XElement.Parse("<message>" + html + "</message>"); 

爲格式良好的XML要求依然存在。這意味着你必須有空的元素,如<br />而不是<br>。如果你想直接在XML中嵌入HTML,那麼沒有辦法。

此外,如果可能的話,你的API接受它,我會推薦給HTML元素的正確XHTML命名空間:

string html = "<html xmlns=\"http://www.w3.org/1999/xhtml\"><body></body></html>"; 
XElement message = new XElement("message", XElement.Parse(html)); 

這會產生這樣的XML:

<message> 
    <html xmlns="http://www.w3.org/1999/xhtml"> 
    <body></body> 
    </html> 
</message> 
+0

真棒,我會測試一下。只是想知道,如果HTML格式不正確,會發生什麼? – dkarzon

+0

好的,所以如果你沒有將HTML作爲有效的XML就會崩潰......只是需要注意我的猜測。 – dkarzon

+0

@ d1k_is:如果格式不正確,它會拋出一個'XmlException',所以你可以捕獲它。不幸的是,據我所知,沒有一個「TryParse」方法。 – Sven

3
new XElement("message", new XRaw(myHtmlStringVariable)); 

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); 
    } 
} 
+2

只是要小心這個代碼將失敗: var xraw = new XRaw(「
」); new XElement(「message」,xraw,xraw); 似乎不止一次處理XRaw對象的使用(WriteTo只被調用一次)。 – oddbear