2011-07-27 16 views
2

System.Linq.Xmlのクラスを使用してXMLオブジェクトを構築します。しかし、私が働いているAPIは、タグにストレートHTMLコードを置くために私を必要とします。XElementにHTMLを追加する

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

私はのXElementを使用して、これを行う方法を見つけ出すように見える傾けます。ただ、すべてのHTML文字<![CDATA[でHTMLをラップ

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

... ]]> API doesntのようにエスケープし

new XElement("message", myHtmlStringVariable); 

XElementのコンテンツに直接HTMLを挿入する方法はありますか?

答えて

9

あなたはこれを行うことができます。これは、HTMLが整形式XMLであり、単一のルート要素を持っていることを必要としない

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

あなたが複数のルート要素を持つHTMLスニペットを持っている場合は、常にこのような要素を作成することができます:

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

整形式のXMLのための要件が​​まだ存在します。つまり、ではなく、<br />のような空の要素が必要です。 HTMLに直接XMLに埋め込みたい場合は、その方法はありません。

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

素晴らしいそれが可能だと、あなたのAPIがそれを受け入れた場合

また、私は、HTML要素に適切なXHTML名前空間を与えることをお勧めします、私はそれをテストします。 HTMLがうまく構成されていないとどうなりますか? – dkarzon

+0

有効なXMLとしてHTMLを持っていないとクラッシュするので、ちょっと考えてみてください。 – 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( "
"); 新しいXElement( "message"、xraw、xraw); XRawオブジェクトの使用を複数回処理していないようです(WriteToは一度呼び出されます)。 – oddbear

関連する問題