2011-05-31 35 views
8

每次我请XmlDocument.Save()插入空的方括号中的文档类型声明

XmlDocument.Save(fooFilepath); 

其插入两个方括号在DOCTYPE标签的端部例如该方法

<?xml version="1.0" encoding="UTF-8"?> 
<!DOCTYPE ARCXML SYSTEM "G:\ArcIMS\DTD\arcxml.dtd"[]> 

有没有人知道为什么会发生这种情况?我显然不希望发生这种情况。

+3

方括号是放置内部子集声明的地方。如果你没有这样的声明,括号是空的,可以省略。但是有空括号没有错。任何符合标准的XML解析器应该能够处理生成的doctype声明,因此唯一的问题是审美问题。 – dtb 2011-05-31 18:44:50

+0

在检查出'XmlWriter.WriteDocType()'实现后,我很困惑为什么一个新的'internalSubset'设置为'null'的'XDocumentType'输出空squary括号。在我的情况下,我正在写Response。输出。在调用'Save()'之前,我确认'doc.DocumentType.InternalSubset'为null。所有的实现似乎都会跳过输出'[]',但是在运行时它会被写入XML。 – 2014-03-25 12:27:38

回答

5

那就是a normal (and optional) part of a DOCTYPE declaration

<!DOCTYPE rootname SYSTEM url [DTD]> 

DTD包含任何内部子集的声明到您的文档。

+0

对! - 我不知道,它看起来很奇怪,但如果它是有效的,那么它的一切都很好。干杯。 – Vidar 2011-05-31 19:06:15

+0

可以预防吗? – 2014-09-17 10:01:03

+0

是的,它是有效的XML语法,但一些解析器无法处理它。 – wisbucky 2014-12-17 01:13:28

2

XmlDocument(使用XmlTextReader)使用的底层读取器不区分具有空内部子集的文档和没有指定内部子集的文档,所以它将返回InternalSubset == ""这两种情况。

然后当XmlDocument.Save()被调用时,它看到一个空字符串InternalSubset并忠实地写入一个空的内部子集:[]

不幸的是,XmlDocument.DocumentType.InternalSubset是只读的,因此您不能将其设置为空。您可以执行以下操作:

  1. 使用较低级别XmlTextWriter.WriteDocType()可以获得更多控制权。

  2. 使用XDocument,在那里你可以设置XDocument.DocumentType.InternalSubset = null