2011-07-27 2 views
2

Utilisation des classes dans System.Linq.Xml pour créer un objet XML. Mais l'API je travaille avec moi besoin de mettre le code HTML directement dans un tag:Ajout de HTML à un objet XElement

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

Je ne peux pas l'air de savoir comment faire en utilisant XElement.

new XElement("message", myHtmlStringVariable); 

qui échappe à juste tous les caractères HTML

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

qui enveloppe le code HTML dans un <![CDATA[ ... ]]> qui ne marche pas l'API comme.

Y a-t-il un moyen d'insérer du HTML directement dans le contenu d'un XElement?

Répondre

9

Vous pouvez le faire:

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

Cela ne nécessite que le HTML est XML bien formé et ne dispose que d'un seul élément racine.

Si vous avez un code HTML avec plusieurs éléments racine, vous pouvez toujours créer l'élément comme celui-ci:

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

L'exigence de XML bien formé existe encore. Cela signifie que vous devez avoir des éléments vides comme <br /> et non <br>. Il n'y a aucun moyen de contourner cela si vous souhaitez intégrer du HTML directement dans XML.

De plus, s'il est possible et votre API accepte, je recommande de donner les éléments HTML l'espace de noms approprié XHTML:

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

Ce produit comme celui-ci XML:

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

Impressionnant Je vais le tester. Je me demandais juste, que se passerait-il si le HTML n'est pas bien formé? – dkarzon

+0

OK, donc il se bloque si vous n'avez pas le HTML comme XML valide ... juste quelque chose à surveiller, je suppose. – dkarzon

+0

@ d1k_is: Il lance une 'XmlException' si elle n'est pas bien formée, donc vous pourriez l'attraper. Malheureusement, il n'y a pas de méthode TryParse pour autant que je sache. – 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

Juste attention que ce code échouera: var xraw = new XRaw ("
"); nouveau XElement ("message", xraw, xraw); Il ne semble pas gérer plus d'une fois l'utilisation d'un objet XRaw (WriteTo n'est appelé qu'une seule fois). – oddbear

Questions connexes