2011-05-31 64 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