【问题标题】:Html Generation from Xml Tree (C#/.NET)从 Xml 树生成 Html (C#/.NET)
【发布时间】:2010-11-22 14:41:42
【问题描述】:

我有一个 HTML 文档作为 Linq-to-XML 对象树存储在内存中。考虑到 HTML 的特性,如何将 XDocument 序列化为 HTML?

例如,<br/> 等空标签应序列化为<br>,而空的<div/> 应序列化为<div></div>

可以从 XSLT 样式表输出 HTML,XmlWriterSettings 有一个可以设置为 HTML 的 OutputMethod 属性 - 但设置器是 internal,供 XSLT 或 Visual Studio 使用,我不能似乎找到了一种将任意 XML 序列化为 HTML 的方法。

因此,除了将 XSLT 仅用于 HTML 输出功能(即通过 XDocument->XmlReader->via XSLT 的其他毫无意义的链运行文档到 HTML 之类的操作)之外,有没有一种方法可以序列化 . NET XDocument 到 HTML?

【问题讨论】:

  • 序列化为 XHTML,问题解决。您是否有任何特殊原因要序列化为旧 HTML?此外,<div /> 应该等同于 <div></div>...
  • @Matt:浏览器在接受 application/xhtml+xml 时可能会正确理解
    ,否则不是。 IE 不会也不会理解 application/xhthml+xml。
  • anthony 说的是问题的核心:Xml(真的:只是一棵有效的树)非常适合 处理,但 HTTP 支持很差,所以我会而不是在与浏览器通信时使用任何形式的 xml。不仅仅是浏览器;使用 xml 意味着不同的内容类型,这会影响 SEO、缓存和代理,所以我宁愿完全避免这些潜在的陷阱并使用普通的旧 html。
  • 我仍然坚持我最初所说的。我坚信 XHTML 是 HTML 的前进方向。 HTML 是一团糟(正如对这个问题的迫切需要所证明的那样)。做正确的事,XHTML,正确的内容类型,让浏览器担心他们的错误实现。在任何情况下,这是你能做的最好的事情。根据我的经验,IE 总体上只是坏了。
  • 哦,原则上我喜欢 XHTML(哎呀,在我短暂的博客尝试中,我曾经写过eamon.nerbonne.org/2006/12/why-xhtml-still-serves-purpose.html)——但我将它视为一种开发工具,而不是一个现实的部署选项。我不喜欢 IE6,但我更希望 IE6 用户看到一个不完美但功能强大的布局,而不是“另存为”对话框。

标签: c# .net html xml linq-to-xml


【解决方案1】:

。 XDocument->XmlReader->XSLT 是您需要的方法。

您正在寻找的是一个专门的序列化程序,它可以任意为标签名称添加含义,例如 brdiv,并以不同的方式呈现。人们还希望这样的序列化程序能够双向工作,IOW 能够读取 HTML 标记汤并生成 XDocument。这样的东西不存在开箱即用。

XmlReader 到 XSLT 看起来很简单,最终只是一个流链。

【讨论】:

  • 令人愤怒的是,在 somewhere 框中显然支持使用 html 规则进行序列化 - 毕竟,它适用于 Xslt,并且有 internal 属性.此外,使用 XSLT 的 html 输出还会在文档的头部添加一个(通常无用且不正确的)META 标记。我将把这个问题留待一段时间,但如果没有人能提出更好的解决方案,我担心你是对的。
【解决方案2】:

和你一样,我真的很惊讶没有公开 HTML 输出方法,除了你已经确定的 XSLT 路由之外,我不知道有什么办法可以绕过它。几年前我遇到同样的问题时,我编写了一个 XmlWriter 包装类,如果正在处理的标签不在列表 {"area", "base" 中,则强制调用 WriteEndElement 在底层 XmlWriter 上使用 WriteFullEndElement 、“basefont”、“bgsound”、“br”、“col”、“embed”、“frame”、“hr”、“isindex”、“image”、“img”、“input”、“link”、“元”,“参数”,“间隔”,“wbr”}。

这解决了

问题,对我来说已经足够了,因为我想写的是多语言文档。我没有找到使
显示为
的方法,但除了无法验证为 HTML 4.01 之外,这不会导致真正的问题。我想如果你真的需要这个,并且不想使用 XSLT 方法,你将不得不编写自己的 XmlWriter 实现。

【讨论】:

    【解决方案3】:

    当然有!

    //XDocument document; string filename;
    XmlWriterSettings settings = new XmlWriterSettings();
    settings.Indent = true;
    typeof(XmlWriterSettings).GetField("outputMethod", BindingFlags.NonPublic|BindingFlags.Instance).SetValue(settings, XmlOutputMethod.Html);
    using(XmlWriter xw = XmlWriter.Create(filename, settings))
    {
        document.Save(xw);
    }
    

    【讨论】:

      猜你喜欢
      • 2011-11-29
      • 2011-10-05
      • 1970-01-01
      • 1970-01-01
      • 2011-05-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多