如何在XmlDocument中插入DOCTYPE元素

3

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

  1. 使用带有XmlAttributes类实例的XmlSerializer生成字符串
  2. 使用在步骤1中生成的字符串,通过LoadXml()方法生成XmlDocument
  3. 使用StringWriter作为参数,使用XmlWriter进行文件写入

现在需要包含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?

2个回答

1
也许在转换过程中需要更多步骤,但是在序列化时,可以使用以下配置的XmlWriterSettings实例来删除xml声明。
var iSettings = new XmlWriterSettings{ OmitXmlDeclaration = true };

谢谢你的建议。我想在使用XmlWriter写入时包含一个XML声明 - 问题是XML声明会被添加到通过LoadXml()创建的XmlDocument中。在我使用WriteDocType()添加DOCTYPE之前,必须将其删除。 - undefined
生成DocType的方式在我看来似乎是正确的方式。 - undefined
我之前不知道有OmitXmlDeclaration设置,它提供了一种不同的方法。虽然这需要更多的步骤/改动,并且没有更简洁的感觉,但我还是会坚持使用原始的方法。 - undefined

0
感谢Codor的答案和讨论,帮助我弄清楚了这个问题,尽管我的代码看起来与问题中的代码有很大不同。
我的XmlDocument也有一个XML声明,所以这对我起作用:
XmlDocument doc = new XmlDocument();
doc.Load(templateFilename);
doc.InsertAfter(doc.CreateDocumentType("html", null, null, null), doc.FirstChild);

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接