【问题标题】:XmlDocument.Save() inserts empty square brackets in doctype declarationXmlDocument.Save() 在 doctype 声明中插入空方括号
【发布时间】:2011-05-31 18:28:16
【问题描述】:

每次我调用该方法时

XmlDocument.Save(fooFilepath);

它在 DOCTYPE 标记的末尾插入两个方括号,例如

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

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

【问题讨论】:

  • 方括号是放置内部子集声明的地方。如果你没有这样的声明,括号是空的,可以省略。但是空括号并没有错。任何符合标准的 XML 解析器都应该能够处理生成的 doctype 声明,所以您唯一的问题是审美问题。
  • 在检查了XmlWriter.WriteDocType() 实现之后,我很困惑为什么将internalSubset 设置为null 的新XDocumentType 输出空方括号。就我而言,我正在写到 Response.Output。在调用Save() 之前,我确认doc.DocumentType.InternalSubset 为空。所有实现似乎都跳过了输出[],但在运行时它被某些东西写入XML。

标签: c# xml


【解决方案1】:

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

<!DOCTYPE rootname SYSTEM url [DTD]>

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

【讨论】:

  • 对! - 我不知道,它只是看起来很奇怪,但如果它是有效的,那么,一切都很好。干杯。
  • 是的,它是有效的 xml 语法,但有些解析器无法处理。
【解决方案2】:

XmlDocument 使用的底层阅读器(使用 XmlTextReader)不区分具有空内部子集的文档和没有指定内部子集的文档,因此对于这两种情况它都会返回 InternalSubset == ""

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

很遗憾,XmlDocument.DocumentType.InternalSubset 是只读的,因此您不能将其设置为 null。你可以这样做:

  1. 使用较低级别的XmlTextWriter.WriteDocType() 进行更多控制。

  2. 使用XDocument,这里可以设置XDocument.DocumentType.InternalSubset = null

【讨论】:

    猜你喜欢
    • 2020-07-20
    • 2015-03-19
    • 1970-01-01
    • 2020-03-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多