将 HTML 5 文档类型添加到 XDocument (.NET)

Posted

技术标签:

【中文标题】将 HTML 5 文档类型添加到 XDocument (.NET)【英文标题】:Add HTML 5 doctype to XDocument (.NET) 【发布时间】:2010-11-27 21:49:51 【问题描述】:

当像这样为 System.Xml.Linq.XDocument 创建文档类型时:

doc.AddFirst(new XDocumentType("html", null, null, null));

生成的已保存 XML 文件以:

<!DOCTYPE html >

注意右尖括号前的多余空格。 我怎样才能防止这个空间出现? 如果可能的话,我想要一个干净的方式:)

【问题讨论】:

【参考方案1】:

如果您写入 XmlTextWriter,您不会获得空间:

XDocument doc = new XDocument();
doc.AddFirst(new XDocumentType("html", null, null, null));
doc.Add(new XElement("foo", "bar"));

using (XmlTextWriter writer = new XmlTextWriter("c:\\temp\\no_space.xml", null)) 
    writer.Formatting = Formatting.Indented;
    doc.WriteTo(writer);
    writer.Flush();
    writer.Close();

【讨论】:

很有趣,但是我不能设置 Settings 属性来省略 XML 声明。我正在使用 XmlWriter.Create,它可以让我传递设置。 在 Reflector 中进行了一番探索之后,似乎 XmlTextWriter 和 XmlEncodedRawTextWriter 的 WriteDocType 实现略有不同。这解释了额外的空格字符。【参考方案2】:

一种方法是为 XmlWriter 编写一个包装类。所以:

XmlWriter writer = new MyXmlWriterWrapper(XmlWriter.Create(..., settings))

然后为 MyXmlWriterWrapper 类定义 XmlWriter 类接口上的每个方法,以将调用直接传递给包装的编写器,WriteDocType 方法除外。然后,您可以将其定义为:

public override void WriteDocType(string name, string pubid, string sysid, string subset)

    if ((pubid == null) && (sysid == null) && (subset == null))
    
        this.wrappedWriter.WriteRaw("<!DOCTYPE HTML>");
    
    else
    
        this.wrappedWriter.WriteDocType(name, pubid, sysid, subset);
    

诚然,这不是一个特别干净的解决方案,但它会完成这项工作。

【讨论】:

我现在正在做类似的事情:使用底层 TextWriter 手动编写 doctype,然后使用 XmlWriter 编写 XDocument。我不再添加 XDocumentType 对象。【参考方案3】:

我可能错了,但我认为这个空间是因为在 HTML 之后需要更多参数。虽然 HTML5 允许这样做。

尝试至少指定第三个参数 (*.dtd)。 或者做这样的事情:

new XDocumentType("html", "-//W3C//DTD XHTML 1.0 Strict//EN", "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd", null)

【讨论】:

这违背了使用不那么繁琐的 HTML5 文档类型的意义。

以上是关于将 HTML 5 文档类型添加到 XDocument (.NET)的主要内容,如果未能解决你的问题,请参考以下文章

如何将 HTML 5 类型属性添加到 laravel 刀片?

Flash 视频播放器 VS HTML 5 视频

iTextsharp 将语言添加到 PDF 文档

html 模块HTML将每个html文档添加到每个TinyMCE模板中

html 模块HTML将每个html文档添加到每个TinyMCE模板中

html 模块HTML将每个html文档添加到每个TinyMCE模板中