将HTML添加到XElement

时间:2011-07-27 07:08:32

标签: c# xml linq

我使用System.Linq.Xml中的类来构建XML对象。但我正在使用的API要求我将HTML代码直接放入标记中:

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

我似乎无法弄清楚如何使用XElement来做到这一点。

new XElement("message", myHtmlStringVariable);

这只是逃避所有HTML字符

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

将HTML包装在API不合适的<![CDATA[ ... ]]>中。

那么有没有办法将HTML直接插入到XElement的内容中?

2 个答案:

答案 0 :(得分: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>等空元素。如果你想直接在HTML中嵌入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>

答案 1 :(得分: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);
  }
}