【问题标题】:Adding HTML to an XElement将 HTML 添加到 XElement
【发布时间】:2011-07-27 07:08:32
【问题描述】:

我正在使用 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 不喜欢的 &lt;![CDATA[...]]&gt; 中。

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

【问题讨论】:

    标签: c# xml linq


    【解决方案1】:

    你可以这样做:

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

    这确实要求 HTML 是格式良好的 XML,并且只有一个根元素。

    如果你有一个包含多个根元素的 HTML sn-p,你总是可以像这样创建元素:

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

    对格式良好的 XML 的要求仍然存在。这意味着您必须有像&lt;br /&gt; 这样的空元素,而不是&lt;br&gt;。如果您想直接在 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>
    

    【讨论】:

    • 太棒了,我会测试一下。只是想知道,如果 HTML 格式不正确会发生什么?
    • 好的,所以如果你没有将 HTML 作为有效的 XML,它会崩溃......我猜只是需要注意的事情。
    • @d1k_is:如果格式不正确,它会抛出一个XmlException,所以你可以抓住它。不幸的是,据我所知,没有TryParse 方法。
    【解决方案2】:
    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);
      }
    }
    

    【讨论】:

    • 请注意这段代码会失败: var xraw = new XRaw("
      ");新 XElement("消息", xraw, xraw);它似乎不会多次处理 XRaw 对象的使用(WriteTo 只调用一次)。
    猜你喜欢
    • 1970-01-01
    • 2011-01-18
    • 2011-01-27
    • 2015-02-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-08-28
    • 1970-01-01
    相关资源
    最近更新 更多