如何在XmlDocument中插入DOCTYPE元素

本文关键字:插入 DOCTYPE 元素 XmlDocument | 更新日期: 2023-09-27 17:58:30

我有一些生产代码,它以以下方式生成XML文件:

  1. 通过对具有XmlAttributes的类的实例使用XmlSerializer生成字符串
  2. 使用LoadXml()和步骤1中生成的字符串生成XmlDocument
  3. 使用XmlWriter包装StringWriter写入文件

现在要求包含DOCTYPE声明。我想对代码进行尽可能少的更改。

到目前为止,我唯一能做到这一点的方法是:

tx.WriteDocType("entitytype", null, "http://testdtd/entity.dtd", null);                    
foreach (XmlNode node in document)
{
  if (node.NodeType == XmlNodeType.XmlDeclaration)
  {
    document.RemoveChild(node);
  }
}
document.WriteTo(tx); 

这似乎有点像黑客——有没有更好的方法可以插入DOCTYPE声明?特别是,有没有一种方法可以避免LoadXml()调用生成的XmlDocument中出现XmlDeclaration?

如何在XmlDocument中插入DOCTYPE元素

也许转换中需要更多的步骤,但在序列化时,可以使用如下配置的XmlWriterSettings实例来删除xml声明。

var iSettings = new XmlWriterSettings{ OmitXmlDeclaration = true };

感谢Codor的回答和讨论,尽管我的代码看起来与问题中的代码非常不同,但它帮助我弄清楚了这一点。

我的XmlDocument也有一个XML声明,所以这对我有效:

XmlDocument doc = new XmlDocument();
doc.Load(templateFilename);
doc.InsertAfter(doc.CreateDocumentType("html", null, null, null), doc.FirstChild);

否则,我想我会使用PrependChild()而不是InsertAfter()