为System.Xml.Linq.XDocument创建文档类型时,如下所示:

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

生成的保存XML文件以:

开头
<!DOCTYPE html >

注意关闭尖括号前的额外空格。 如何防止出现此空间? 如果可能的话,我想要一个干净的方式:)

有帮助吗?

解决方案

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

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

然后,对于MyXmlWriterWrapper类,定义XmlWriter类接口上的每个方法,将调用直接传递给包装的writer,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);
    }
}

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

其他提示

如果您写入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();
        }

我可能错了,但我认为这个空间是因为在HTML之后预期会有更多参数。虽然HTML5允许它。

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

new XDocumentType("html", "-//W3C//DTD XHTML 1.0 Strict//EN", "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd", null)
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top